This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Creating a "mrcomba" file

I am working with the DSP C6713, and the cryptographic library Miracl. Also It is important to note that I am Using the Code Composer Studio V 5.2.1.  In a file called "texasdsp.txt" the Miracl' people,  give an instruction: 
"Then create mrcomba.c by executing (after compiling mex.c on any PC)
mex -s 6 c mrcomba"
How can I compile mex.c and after that execute the previous line?.
In the source folder there is a file named "mrcomba.tpl".
Thanks.
Mario Pinto. 
  • Mario Pinto,

    Thanks for your post.
    Please provide the details of software package used by you.
    Are you refering the DSK software which is released by spectrum digital or else?
    http://c6000.spectrumdigital.com/dsk6713/
    Which software package having the files "mex.c, mrcomba.c, Miracl and mrcomba.tpl"?

  • The files mex.c, mrcomba.tpl and Miracl.h were included in the Miracl cryptographic library supplied by Certivox. I am using the TMS320C6713 DSK supplied by Spectrum Digital, with the Code Composer Studio V5.2.1

    /***************************************************************************
                                                                               *
    Copyright 2013 CertiVox IOM Ltd.                                           *
                                                                               *
    This file is part of CertiVox MIRACL Crypto SDK.                           *
                                                                               *
    The CertiVox MIRACL Crypto SDK provides developers with an                 *
    extensive and efficient set of cryptographic functions.                    *
    For further information about its features and functionalities please      *
    refer to http://www.certivox.com                                           *
                                                                               *
    * The CertiVox MIRACL Crypto SDK is free software: you can                 *
      redistribute it and/or modify it under the terms of the                  *
      GNU Affero General Public License as published by the                    *
      Free Software Foundation, either version 3 of the License,               *
      or (at your option) any later version.                                   *
                                                                               *
    * The CertiVox MIRACL Crypto SDK is distributed in the hope                *
      that it will be useful, but WITHOUT ANY WARRANTY; without even the       *
      implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
      See the GNU Affero General Public License for more details.              *
                                                                               *
    * You should have received a copy of the GNU Affero General Public         *
      License along with CertiVox MIRACL Crypto SDK.                           *
      If not, see <http://www.gnu.org/licenses/>.                              *
                                                                               *
    You can be released from the requirements of the license by purchasing     *
    a commercial license. Buying such a license is mandatory as soon as you    *
    develop commercial activities involving the CertiVox MIRACL Crypto SDK     *
    without disclosing the source code of your own applications, or shipping   *
    the CertiVox MIRACL Crypto SDK with a closed source product.               *
                                                                               *
    ***************************************************************************/
    /* mex.c
     *
     * Updated to allow emission of scheduled code. 
     *
     * Macro EXpansion program.
     * Expands Macros from a .mcs file into a .tpl file to create a .c file
     *
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef int BOOL;
    #define FALSE 0
    #define TRUE 1
    
    /* Define Algorithms */
    
    #define MULTIPLY 0
    #define MULTUP 1
    #define SQUARE 2
    #define REDC 3
    #define ADDITION 4
    #define INCREMENT 5
    #define SUBTRACTION 6
    #define DECREMENT 7
    #define SUMMATION 8
    #define INCREMENTATION 9
    #define DECREMENTATION 10
    #define MULTIPLY2 11
    #define ADDITION2 12
    #define SUBTRACTION2 13
    #define PMULT 14
    #define DOUBLEIT 15
    
    
    /* Define Macros */
    
    #define MUL_START       0
    #define STEP            1
    #define STEP1M          2
    #define STEP1A          3
    #define STEP2M          4
    #define STEP2A          5
    #define MFIN            6
    #define MUL_END         7
    #define LAST            8
    #define SQR_START       9
    #define DSTEP           10
    #define DSTEP1M         11
    #define DSTEP1A         12
    #define DSTEP2M         13
    #define DSTEP2A         14
    #define SELF            15
    #define SFIN            16
    #define SQR_END         17
    #define REDC_START      18
    #define RFINU           19
    #define RFIND           20
    #define REDC_END        21
    #define ADD_START       22
    #define ADD             23
    #define ADD_END         24
    #define SUB_START       25
    #define SUB             26
    #define SUB_END         27
    #define INC_START       28
    #define INC             29
    #define INC_END         30
    #define DEC_START       31
    #define DEC             32
    #define DEC_END         33
    #define KADD_START      34
    #define KASL            35
    #define KADD_END        36
    #define KINC_START      37
    #define KIDL            38
    #define KINC_END        39
    #define KDEC_START      40
    #define KDEC_END        41
    #define STEPB           42
    #define STEPB1M         43
    #define STEPB1A         44
    #define STEPB2M         45
    #define STEPB2A         46
    #define H2_MUL_START    47
    #define H2_STEP         48
    #define H2_MFIN         49
    #define H2_MUL_END      50
    #define H2_SQR_START    51
    #define H2_DSTEP        52
    #define H2_SELF         53
    #define H2_SFIN         54
    #define H2_SQR_END      55
    #define H4_MUL_START    56
    #define H4_STEP         57
    #define H4_MFIN         58
    #define H4_MUL_END      59
    #define H4_SQR_START    60
    #define H4_DSTEP        61
    #define H4_SELF         62
    #define H4_SFIN         63
    #define H4_SQR_END      64
    #define H2_LAST         65
    #define H4_LAST         66 
    #define PMUL_START      67
    #define PMUL            68
    #define PMUL_END        69
    #define MULB_START      70
    #define MULB_END        71
    #define MBFIN           72
    #define H2_MULB_START   73
    #define H2_MULB_END     74
    #define H2_MBFIN        75
    #define H2_STEPB        76
    #define H4_MULB_START   77
    #define H4_MULB_END     78
    #define H4_MBFIN        79
    #define H4_STEPB        80
    #define H2_REDC_START   81
    #define H2_RFINU        82
    #define H2_RFIND        83
    #define H2_REDC_END     84
    #define H4_REDC_START   85
    #define H4_RFINU        86
    #define H4_RFIND        87
    #define H4_REDC_END     88
    #define DOUBLE_START    89
    #define DOUBLE          90
    #define DOUBLE_END      91
    #define LAST_ONE        92
    
    BOOL scheduled;
    int hybrid,hybrid_b,pmp,hybrid_r;
    
    int PARAM;
    char *macro[LAST_ONE]; /* macro text */ 
    
    char *functions[]={(char *)"MULTIPLY",(char *)"MULTUP",(char *)"SQUARE",(char *)"REDC",(char *)"ADDITION",(char *)"INCREMENT",
                     (char *)"SUBTRACTION",(char *)"DECREMENT",(char *)"SUMMATION",(char *)"INCREMENTATION",
                     (char *)"DECREMENTATION",(char *)"MULTIPLY2",(char *)"ADDITION2",(char *)"SUBTRACTION2",(char *)"PMULT",(char *)"DOUBLEIT",NULL};
    
    char *names[]={(char *)"MUL_START",(char *)"STEP",(char *)"STEP1M",(char *)"STEP1A",(char *)"STEP2M",
                   (char *)"STEP2A",(char *)"MFIN",(char *)"MUL_END",(char *)"LAST",(char *)"SQR_START",(char *)"DSTEP",
                   (char *)"DSTEP1M",(char *)"DSTEP1A",(char *)"DSTEP2M",(char *)"DSTEP2A",(char *)"SELF",
                   (char *)"SFIN",(char *)"SQR_END",(char *)"REDC_START",(char *)"RFINU",(char *)"RFIND",
                   (char *)"REDC_END",(char *)"ADD_START",(char *)"ADD",(char *)"ADD_END",(char *)"SUB_START",(char *)"SUB",
                   (char *)"SUB_END",(char *)"INC_START",(char *)"INC",(char *)"INC_END",(char *)"DEC_START",(char *)"DEC",
                   (char *)"DEC_END",(char *)"KADD_START",(char *)"KASL",(char *)"KADD_END",(char *)"KINC_START",(char *)"KIDL",
                   (char *)"KINC_END",(char *)"KDEC_START",(char *)"KDEC_END",(char *)"STEPB",(char *)"STEPB1M",(char *)"STEPB1A",(char *)"STEPB2M",(char *)"STEPB2A",
                   (char *)"H2_MUL_START",(char *)"H2_STEP",(char *)"H2_MFIN",(char *)"H2_MUL_END",
                   (char *)"H2_SQR_START",(char *)"H2_DSTEP",(char *)"H2_SELF",(char *)"H2_SFIN",(char *)"H2_SQR_END",
                   (char *)"H4_MUL_START",(char *)"H4_STEP",(char *)"H4_MFIN",(char *)"H4_MUL_END",
                   (char *)"H4_SQR_START",(char *)"H4_DSTEP",(char *)"H4_SELF",(char *)"H4_SFIN",(char *)"H4_SQR_END",(char *)"H2_LAST",(char *)"H4_LAST",
                    (char *)"PMUL_START",(char *)"PMUL",(char *)"PMUL_END",(char *)"MULB_START",(char *)"MULB_END",(char *)"MBFIN",
                    (char *)"H2_MULB_START",(char *)"H2_MULB_END",(char *)"H2_MBFIN",(char *)"H2_STEPB",
                    (char *)"H4_MULB_START",(char *)"H4_MULB_END",(char *)"H4_MBFIN",(char *)"H4_STEPB",
                    (char *)"H2_REDC_START",(char *)"H2_RFINU",(char *)"H2_RFIND",(char *)"H2_REDC_END",
                    (char *)"H4_REDC_START",(char *)"H4_RFINU",(char *)"H4_RFIND",(char *)"H4_REDC_END",
                    (char *)"DOUBLE_START",(char *)"DOUBLE",(char *)"DOUBLE_END",NULL};
    
    BOOL white(char c)
    {
        if (c==' ' || c=='\n' || c=='\r' || c=='\t') return TRUE;
        else return FALSE;
    }
    
    int skip(char *c,int i)
    {
        while (white(c[i])) i++;
        return i;
    }
    
    int which(char *name,char *names[])
    {
        int ipt=0;  
        while (names[ipt]!=NULL)
        {
            if (strcmp(name,names[ipt])==0) return ipt;
            ipt++;
        }
        return -1;
    }
    
    void m_prologue(FILE *dotc,int k,int m)
    {
        fprintf(dotc,macro[STEP1M],k,m); 
    }
    
    void m_epilogue(FILE *dotc,int x)
    {
        if (x==1) fprintf(dotc,macro[STEP1A]);
        else      fprintf(dotc,macro[STEP2A]);
    }
    
    void m_schedule(FILE *dotc,int x,int k,int m)
    {
        if (x==1)
        {
            fprintf(dotc,macro[STEP2M],k,m);
            fprintf(dotc,macro[STEP1A]);
        }
        else
        {
            fprintf(dotc,macro[STEP1M],k,m);
            fprintf(dotc,macro[STEP2A]);
        }
    }
    
    void m_prologue2(FILE *dotc,int k,int m)
    {
        fprintf(dotc,macro[STEPB1M],k,m); 
    }
    
    void m_epilogue2(FILE *dotc,int x)
    {
        if (x==1) fprintf(dotc,macro[STEPB1A]);
        else      fprintf(dotc,macro[STEPB2A]);
    }
    
    void m_schedule2(FILE *dotc,int x,int k,int m)
    {
        if (x==1)
        {
            fprintf(dotc,macro[STEPB2M],k,m);
            fprintf(dotc,macro[STEPB1A]);
        }
        else
        {
            fprintf(dotc,macro[STEPB1M],k,m);
            fprintf(dotc,macro[STEPB2A]);
        }
    }
    
    void s_prologue(FILE *dotc,int k,int m)
    {
        fprintf(dotc,macro[DSTEP1M],k,m);
    }
    
    void s_epilogue(FILE *dotc,int x)
    {
        if (x==1) fprintf(dotc,macro[DSTEP1A]);
        else      fprintf(dotc,macro[DSTEP2A]);
    }
    
    void s_schedule(FILE *dotc,int x,int k,int m)
    {
        if (x==1)
        {
            fprintf(dotc,macro[DSTEP2M],k,m);
            fprintf(dotc,macro[DSTEP1A]);
        }
        else
        {
            fprintf(dotc,macro[DSTEP1M],k,m);
            fprintf(dotc,macro[DSTEP2A]);
        }
    }
    
    /* Insert functions into template file */
    
    void insert(int index,FILE *dotc)
    {
        int i,k,m,n,x,inc;
        switch (index)
        {
        case PMULT:
            if (!pmp) break;
            fprintf(dotc,macro[PMUL_START]);
            for (i=0;i<PARAM;i++)
            {
                fprintf(dotc,macro[PMUL],i,i,i);
            }
            fprintf(dotc,macro[PMUL_END]);
            break;
        case MULTIPLY2:
            inc=1;
            if (hybrid_b)
            {
                inc=hybrid_b;
                if (hybrid_b==2)  fprintf(dotc,macro[H2_MULB_START]);
                if (hybrid_b==4)  fprintf(dotc,macro[H4_MULB_START]);
            }
            else fprintf(dotc,macro[MULB_START]);
            for (i=n=0;i<PARAM;i+=inc,n+=inc)
            {    
                k=0; m=i;
                if (scheduled)
                {
                    x=1;
                    m_prologue2(dotc,k,m);
                    k++; m--;
    
                    while (k<=i)
                    {
                        m_schedule2(dotc,x,k,m);
                        k++; m--;
                        x=3-x;
                    }
    
                    m_epilogue2(dotc,x);
    
                }
                else
                {
                    while (k<=i)
                    {
                        if (hybrid_b)
                        {
                            if (hybrid_b==2) fprintf(dotc,macro[H2_STEPB],k,k,m,m);
                            if (hybrid_b==4) fprintf(dotc,macro[H4_STEPB],k,k,k,k,m,m,m,m);
                        }
                        else fprintf(dotc,macro[STEPB],k,m);
                        k+=inc; m-=inc;
                    }
    
                }
                if (hybrid_b) 
                {
                    if (hybrid_b==2) fprintf(dotc,macro[H2_MBFIN],n,n+1);
                    if (hybrid_b==4) fprintf(dotc,macro[H4_MBFIN],n,n+1,n+2,n+3);
                }
                else fprintf(dotc,macro[MBFIN],n);
    
            }
            for (i=0;i<PARAM-inc;i+=inc,n+=inc)
            {
                k=i+inc; m=PARAM-inc;
                if (scheduled)
                {
                    x=1;
                    m_prologue2(dotc,k,m);
                    k++; m--;
    
                    while (k<=PARAM-1)
                    {
                        m_schedule2(dotc,x,k,m);
                        k++; m--;
                        x=3-x;
                    }
                    m_epilogue2(dotc,x);
                }
                else
                {
                    while (k<=PARAM-inc)
                    {
                        if (hybrid_b)
                        {
                            if (hybrid_b==2) fprintf(dotc,macro[H2_STEPB],k,k,m,m);
                            if (hybrid_b==4) fprintf(dotc,macro[H4_STEPB],k,k,k,k,m,m,m,m);
                        }
                        else fprintf(dotc,macro[STEPB],k,m);
                        k+=inc; m-=inc;
                    }
                }
                if (hybrid_b) 
                {
                    if (hybrid_b==2) fprintf(dotc,macro[H2_MBFIN],n,n+1);
                    if (hybrid_b==4) fprintf(dotc,macro[H4_MBFIN],n,n+1,n+2,n+3);
                }
                else fprintf(dotc,macro[MBFIN],n);
        
            }
    
            if (hybrid_b) 
            {
                if (hybrid_b==2) fprintf(dotc,macro[H2_MULB_END],2*PARAM-2);
                if (hybrid_b==4) fprintf(dotc,macro[H4_MULB_END],2*PARAM-4,2*PARAM-3,2*PARAM-2);
            }
            else fprintf(dotc,macro[MULB_END]);
        break;
        case MULTIPLY: 
            inc=1;
            if (hybrid)
            {
                inc=hybrid;
                if (hybrid==2)  fprintf(dotc,macro[H2_MUL_START]);
                if (hybrid==4)  fprintf(dotc,macro[H4_MUL_START]);
            }
            else fprintf(dotc,macro[MUL_START]);
            for (i=n=0;i<PARAM;i+=inc,n+=inc)
            {    
                k=0; m=i;
    
                if (scheduled)
                {
                    x=1;
                    m_prologue(dotc,k,m);
                    k++; m--;
    
                    while (k<=i)
                    {
                        m_schedule(dotc,x,k,m);
                        k++; m--;
                        x=3-x;
                    }
    
                    m_epilogue(dotc,x);
    
                }
                else
                {
                    while (k<=i)
                    {
                        if (hybrid)
                        {
                            if (hybrid==2) fprintf(dotc,macro[H2_STEP],k,k,m,m);
                            if (hybrid==4) fprintf(dotc,macro[H4_STEP],k,k,k,k,m,m,m,m);
                        }
                        else fprintf(dotc,macro[STEP],k,m);
                        k+=inc; m-=inc;
                    }
                }
                if (hybrid) 
                {
                    if (hybrid==2) fprintf(dotc,macro[H2_MFIN],n,n+1);
                    if (hybrid==4) fprintf(dotc,macro[H4_MFIN],n,n+1,n+2,n+3);
                }
                else fprintf(dotc,macro[MFIN],n);
            }
            for (i=0;i<PARAM-inc;i+=inc,n+=inc)
            {
                k=i+inc; m=PARAM-inc;
    
                if (scheduled)
                {
                    x=1;
                    m_prologue(dotc,k,m);
                    k++; m--;
    
                    while (k<=PARAM-1)
                    {
                        m_schedule(dotc,x,k,m);
                        k++; m--;
                        x=3-x;
                    }
                    m_epilogue(dotc,x);
                }
                else
                {
                    while (k<=PARAM-inc)
                    {
                        if (hybrid)
                        {
                            if (hybrid==2) fprintf(dotc,macro[H2_STEP],k,k,m,m);
                            if (hybrid==4) fprintf(dotc,macro[H4_STEP],k,k,k,k,m,m,m,m);
                        }
                        else fprintf(dotc,macro[STEP],k,m);
                        k+=inc; m-=inc;
                    }
                }
                if (hybrid) 
                {
                    if (hybrid==2) fprintf(dotc,macro[H2_MFIN],n,n+1);
                    if (hybrid==4) fprintf(dotc,macro[H4_MFIN],n,n+1,n+2,n+3);
                }
                else fprintf(dotc,macro[MFIN],n);
            }
            if (hybrid) 
            {
                if (hybrid==2) fprintf(dotc,macro[H2_MUL_END],2*PARAM-2,2*PARAM-1);
                if (hybrid==4) fprintf(dotc,macro[H4_MUL_END],2*PARAM-4,2*PARAM-3,2*PARAM-2,2*PARAM-1);
            }
            else fprintf(dotc,macro[MUL_END],2*PARAM-1);
            break;
        case MULTUP:
            inc=1;
            if (hybrid)
            {
                inc=hybrid;
                if (hybrid==2)  fprintf(dotc,macro[H2_MUL_START]);
                if (hybrid==4)  fprintf(dotc,macro[H4_MUL_START]);
            }
            else fprintf(dotc,macro[MUL_START]);
    
            for (i=n=0;i<PARAM-inc;i+=inc,n+=inc)
            {    
                k=0; m=i;
    
                if (scheduled)
                {   
                    x=1;
                    m_prologue(dotc,k,m);
                    k++; m--;
    
                    while (k<=i)
                    {
                        m_schedule(dotc,x,k,m);
                        k++; m--;
                        x=3-x;
                    }
                    m_epilogue(dotc,x);
                }
                else
                {
                    while (k<=i)
                    {
                        if (hybrid)
                        {
                            if (hybrid==2) fprintf(dotc,macro[H2_STEP],k,k,m,m);
                            if (hybrid==4) fprintf(dotc,macro[H4_STEP],k,k,k,k,m,m,m,m);
                        }
                        else fprintf(dotc,macro[STEP],k,m);
                        k+=inc; m-=inc;
                    }
                }
                if (hybrid) 
                {
                    if (hybrid==2) fprintf(dotc,macro[H2_MFIN],n,n+1);
                    if (hybrid==4) fprintf(dotc,macro[H4_MFIN],n,n+1,n+2,n+3);
                }
                else fprintf(dotc,macro[MFIN],n);
            }
            k=0; m=PARAM-inc;
            while (k<=i)
            {
                if (hybrid)
                {
                    if (hybrid==2) fprintf(dotc,macro[H2_LAST],k,k,m,m);
                    if (hybrid==4) fprintf(dotc,macro[H4_LAST],k,k,k,k,m,m,m,m);
                }
                else fprintf(dotc,macro[LAST],k,m);
                k+=inc; m-=inc;
            }
    
            if (hybrid) 
            {
                if (hybrid==2) fprintf(dotc,macro[H2_MUL_END],PARAM-2,PARAM-1);
                if (hybrid==4) fprintf(dotc,macro[H4_MUL_END],PARAM-4,PARAM-3,PARAM-2,PARAM-1);
            }
            else fprintf(dotc,macro[MUL_END],PARAM-1);
            break;
        case SQUARE:   
            inc=1;
            if (hybrid)
            {
                inc=hybrid;
                if (hybrid==2) fprintf(dotc,macro[H2_SQR_START]);
                if (hybrid==4) fprintf(dotc,macro[H4_SQR_START]);
            }
            else fprintf(dotc,macro[SQR_START]);
            for (i=n=0;i<PARAM;i+=inc,n+=inc)
            {
                k=0; m=i;
    
                if (scheduled)
                {  
                    if (k<m)
                    {
                        x=1;
                        s_prologue(dotc,k,m);
                        k++; m--;
    
                        while (k<m)
                        {
                            s_schedule(dotc,x,k,m);
                            k++; m--;
                            x=3-x;
                        }
                       s_epilogue(dotc,x);
                    }
                }
                else
                {
                    while (k<m)
                    {
                        if (hybrid) 
                        {
                            if (hybrid==2) fprintf(dotc,macro[H2_DSTEP],k,k,m,m);
                            if (hybrid==4) fprintf(dotc,macro[H4_DSTEP],k,k,k,k,m,m,m,m);
                        }
                        else fprintf(dotc,macro[DSTEP],k,m);
                        k+=inc; m-=inc;
                    }
                }
                if (hybrid)
                {
                    if (hybrid==2 && n%4==0) fprintf(dotc,macro[H2_SELF],n/2,n/2);
                    if (hybrid==4 && n%8==0) fprintf(dotc,macro[H4_SELF],n/2,n/2,n/2,n/2);
                }
                else
                {
                    if (n%2==0) fprintf(dotc,macro[SELF],n/2,n/2);
                } 
                if (hybrid) 
                {
                    if (hybrid==2) fprintf(dotc,macro[H2_SFIN],n,n+1);
                    if (hybrid==4) fprintf(dotc,macro[H4_SFIN],n,n+1,n+2,n+3);
                }
                else fprintf(dotc,macro[SFIN],n);
            }
            for (i=0;i<PARAM-inc;i+=inc,n+=inc)
            {
                k=i+inc; m=PARAM-inc;
    
                if (scheduled)
                {
                    if (k<m)
                    {
                        x=1;
                        s_prologue(dotc,k,m);
                        k++; m--;
    
                        while (k<m)
                        {
                            s_schedule(dotc,x,k,m);
                            k++; m--;
                            x=3-x;
                        }
                        s_epilogue(dotc,x);
                    }
                }
                else
                {
                    while (k<m)
                    {
                        if (hybrid) 
                        {
                            if (hybrid==2) fprintf(dotc,macro[H2_DSTEP],k,k,m,m);
                            if (hybrid==4) fprintf(dotc,macro[H4_DSTEP],k,k,k,k,m,m,m,m);
                        }
                        else fprintf(dotc,macro[DSTEP],k,m);
                        k+=inc; m-=inc;
                    }
                }
                if (hybrid)
                {
                    if (hybrid==2 && n%4==0) fprintf(dotc,macro[H2_SELF],n/2,n/2);
                    if (hybrid==4 && n%8==0) fprintf(dotc,macro[H4_SELF],n/2,n/2,n/2,n/2);
                }
                else
                {
                    if (n%2==0) fprintf(dotc,macro[SELF],n/2,n/2);
                }
                if (hybrid) 
                {
                    if (hybrid==2) fprintf(dotc,macro[H2_SFIN],n,n+1);
                    if (hybrid==4) fprintf(dotc,macro[H4_SFIN],n,n+1,n+2,n+3);
                }
                else fprintf(dotc,macro[SFIN],n);
            }
            if (hybrid) 
            {
                if (hybrid==2) fprintf(dotc,macro[H2_SQR_END],2*PARAM-2,2*PARAM-1);
                if (hybrid==4) fprintf(dotc,macro[H4_SQR_END],2*PARAM-4,2*PARAM-3,2*PARAM-2,2*PARAM-1);
            }
            else fprintf(dotc,macro[SQR_END],2*PARAM-1);
            break;
        case REDC:  
            inc=1;
            if (hybrid_r)
            {
                inc=hybrid_r;
                if (hybrid_r==2)
                {    
                    fprintf(dotc,macro[H2_REDC_START]);
                    fprintf(dotc,macro[H2_RFINU],0,0,0,0);
                }
                if (hybrid_r==4)
                {    
                    fprintf(dotc,macro[H4_REDC_START]);
                    fprintf(dotc,macro[H4_RFINU],0,0,0,0,0,0,0,0);
                }
            }
            else 
            {    
                fprintf(dotc,macro[REDC_START]);
                fprintf(dotc,macro[RFINU],0,0);
            }
    
            for (i=n=inc;i<PARAM;i+=inc,n+=inc)
            {
                k=0; m=i;
    
                if (scheduled)
                {
                    x=1;
                    m_prologue(dotc,k,m);
                    k++; m--;
    
                    while (k<i)
                    {
                        m_schedule(dotc,x,k,m);
                        k++; m--;
                        x=3-x;
                    }
                    m_epilogue(dotc,x);
                }
                else
                {
                    while (k<i)
                    {
                       if (hybrid_r)
                        {
                            if (hybrid_r==2) fprintf(dotc,macro[H2_STEP],k,k,m,m);
                            if (hybrid_r==4) fprintf(dotc,macro[H4_STEP],k,k,k,k,m,m,m,m);
                        }
                        else fprintf(dotc,macro[STEP],k,m);
                        k+=inc; m-=inc;
                    }
                }
    
                if (hybrid_r) 
                {
                    if (hybrid_r==2) fprintf(dotc,macro[H2_RFINU],n,n,n,n);
                    if (hybrid_r==4) fprintf(dotc,macro[H4_RFINU],n,n,n,n,n,n,n,n);
                }
                else fprintf(dotc,macro[RFINU],n,n);
            }
    
            for (i=0;i<PARAM-inc;i+=inc,n+=inc)
            {
                k=i+inc; m=PARAM-inc;
    
                if (scheduled)
                {
                    x=1;
                    m_prologue(dotc,k,m);
                    k++; m--;
    
                    while (k<=PARAM-1)
                    {
                        m_schedule(dotc,x,k,m);
                        k++; m--;
                        x=3-x;
                    }
                    m_epilogue(dotc,x);
                }
                else
                {
                   while (k<=PARAM-inc)
                    {
                        if (hybrid_r)
                        {
                            if (hybrid_r==2) fprintf(dotc,macro[H2_STEP],k,k,m,m);
                            if (hybrid_r==4) fprintf(dotc,macro[H4_STEP],k,k,k,k,m,m,m,m);
                        }
                        else fprintf(dotc,macro[STEP],k,m);
                        k+=inc; m-=inc;
                    }
                }
    
                if (hybrid_r) 
                {
                    if (hybrid_r==2) fprintf(dotc,macro[H2_RFIND],n,n,n,n);
                    if (hybrid_r==4) fprintf(dotc,macro[H4_RFIND],n,n,n,n,n,n,n,n);
                }
                else fprintf(dotc,macro[RFIND],n,n);
            }
            if (hybrid_r)
            {
                if (hybrid_r==2) fprintf(dotc,macro[H2_REDC_END],2*PARAM-inc,2*PARAM-inc,2*PARAM-inc);
                if (hybrid_r==4) fprintf(dotc,macro[H4_REDC_END],2*PARAM-inc,2*PARAM-inc,2*PARAM-inc,2*PARAM-inc,2*PARAM-inc);
            }
            else fprintf(dotc,macro[REDC_END],2*PARAM-1,2*PARAM-1);
    
            break;
    
        case ADDITION:    
            fprintf(dotc,macro[ADD_START]);
            for (i=1;i<PARAM;i++)
                fprintf(dotc,macro[ADD],i,i,i);
            fprintf(dotc,macro[ADD_END]);
            break;
        case ADDITION2:
            fprintf(dotc,macro[ADD_START]);
            for (i=1;i<2*PARAM;i++)
                fprintf(dotc,macro[ADD],i,i,i);
            fprintf(dotc,macro[ADD_END]);
            break;
        case INCREMENT:
            fprintf(dotc,macro[INC_START]);
            for (i=1;i<PARAM;i++)
                fprintf(dotc,macro[INC],i,i,i);
            fprintf(dotc,macro[INC_END]);
            break;
        case DOUBLEIT:
            if (macro[DOUBLE_START]!=NULL)
            {
                fprintf(dotc,macro[DOUBLE_START]);
                for (i=1;i<PARAM;i++)
                    fprintf(dotc,macro[DOUBLE],i,i);
                fprintf(dotc,macro[DOUBLE_END]);
            }
            else
            {
                fprintf(dotc,macro[INC_START]);
                for (i=1;i<PARAM;i++)
                    fprintf(dotc,macro[INC],i,i,i);
                fprintf(dotc,macro[INC_END]);
            }
            break;
    
        case SUBTRACTION:
            fprintf(dotc,macro[SUB_START]);
            for (i=1;i<PARAM;i++)
                fprintf(dotc,macro[SUB],i,i,i);
            fprintf(dotc,macro[SUB_END]);
            break;
        case SUBTRACTION2:
            fprintf(dotc,macro[SUB_START]);
            for (i=1;i<2*PARAM;i++)
                fprintf(dotc,macro[SUB],i,i,i);
            fprintf(dotc,macro[SUB_END]);
            break;
        case DECREMENT:
            fprintf(dotc,macro[DEC_START]);
            for (i=1;i<PARAM;i++)
                fprintf(dotc,macro[DEC],i,i,i);
            fprintf(dotc,macro[DEC_END]);
            break;
        case SUMMATION:
            fprintf(dotc,macro[KADD_START],1);
            for (i=0;i<PARAM;i++)
                fprintf(dotc,macro[ADD],i,i,i);
            fprintf(dotc,macro[KASL],2,PARAM,PARAM,PARAM,1,2);
            fprintf(dotc,macro[KADD_END]);
            break;
        case INCREMENTATION:
            fprintf(dotc,macro[KINC_START],3);
            for (i=0;i<PARAM;i++)
                fprintf(dotc,macro[INC],i,i,i);
            fprintf(dotc,macro[KIDL],4,PARAM,PARAM,3,4);
            fprintf(dotc,macro[KINC_END]);
            break;
        case DECREMENTATION:
            fprintf(dotc,macro[KDEC_START],5);
            for (i=0;i<PARAM;i++)
                fprintf(dotc,macro[DEC],i,i,i);
            fprintf(dotc,macro[KIDL],6,PARAM,PARAM,5,6);
            fprintf(dotc,macro[KDEC_END]);
            break;
        default:
            break;
        }
    }
    
    int main(int argc,char **argv)
    {
        FILE *templat,*macros,*dotc;
        int i,ip,ptr,index,size;
        BOOL open,error;
        char fname[80],tmpl[80],name[20];
        char line[133];
        argc--; argv++;
        if (argc<3 || argc>4)
        {
           printf("Bad arguments\n");
           printf("mex <parameter> <.mcs file> <.tpl file>\n");
           printf("Use flag -s for scheduled code\n");
           printf("Examples:\n");
           printf("mex 6 ms86 mrcomba\n");
           printf("mex -s 8 c mrkcm\n");
           exit(0);
        }
        ip=0;
        scheduled=FALSE;
        if (strcmp(argv[0],"-s")==0)
        {
            ip=1;
            scheduled=TRUE;
        }
    
        PARAM=atoi(argv[ip]);
        if (PARAM<2 || PARAM>40)
        {
            printf("Invalid parameter\n");
            exit(0);
        }
        strcpy(fname,argv[ip+1]);
        strcat(fname,".mcs");
        macros=fopen(fname,"rt");
        if (macros==NULL)
        {
            printf("Macro file %s not found\n",fname);
            exit(0);
        }
    
        strcpy(tmpl,argv[ip+2]);
        strcat(tmpl,".tpl");
        templat=fopen(tmpl,"rt");
        if (templat==NULL)
        {
            printf("Template file %s file not found\n",tmpl);
            exit(0);
        }
        strcpy(tmpl,argv[ip+2]);
        strcat(tmpl,".c");
        dotc=fopen(tmpl,"wt");
        if (dotc==NULL)
        {
            printf("Unable to open %s for output\n",tmpl);
            exit(0);
        }
    
        for (i=0;i<LAST_ONE;i++) macro[i]=NULL;
    
    /* read in the macros - first pass to determine size and check for errors */
        open=error=FALSE;
        while (1)
        {
            if (fgets(line,132,macros)==NULL) break;
            if (line[0]==';') continue;
            
            if (!open && strncmp(line,"MACRO",5)==0) 
            {
                    open=TRUE;
                    ptr=6; i=0;
                    ptr=skip(line,ptr);
                    while (!white(line[ptr])) name[i++]=line[ptr++];
                    name[i]='\0';
                    index=which(name,names);
                    if (index<0)
                    {
                        error=TRUE;
                        break;
                    }
                    size=0;
                    continue;
            }
            if (open && strncmp(line,"ENDM",4)==0) 
            {
                    open=FALSE;
                    macro[index]=(char *)malloc(size+1);
                    macro[index][0]='\0';
            }
    
            if (open) size+=(int)strlen(line);
        }
        fclose(macros);
        if (error)
        {
            printf("no such macro - %s\n",name);
            exit(0);
        }
    
    /* read in the macros - second pass to store macros */     
        macros=fopen(fname,"rt");   
        while (1)
        {
            if (fgets(line,132,macros)==NULL) break;
            if (line[0]==';') continue;
    
            if (!open && strncmp(line,"MACRO",5)==0) 
            {
                    open=TRUE;
                    ptr=6; i=0;
                    ptr=skip(line,ptr);
                    while (!white(line[ptr])) name[i++]=line[ptr++];
                    name[i]='\0';
                    index=which(name,names);
                    continue;
            }
            if (open && strncmp(line,"ENDM",4)==0) open=FALSE;
    
            if (open) strcat(macro[index],line);
        }
        fclose(macros);
    
        if (macro[PMUL]==NULL)
        {
           /* printf("Pseudo Mersenne Primes not (yet) supported for this architecture in file %s\n",fname); */
            pmp=0;
        }
        else pmp=1;
    
        if (scheduled && macro[STEP1M]==NULL)
        {
            printf("Error - scheduling not supported in file %s\n",fname);
            exit(0);
        }
        hybrid=0;
        if (macro[H2_STEP]!=NULL) hybrid=2; 
        if (macro[H4_STEP]!=NULL) hybrid=4;
    
        hybrid_b=0;
        if (macro[H2_STEPB]!=NULL) hybrid_b=2; 
        if (macro[H4_STEPB]!=NULL) hybrid_b=4;
    
        hybrid_r=0;
        if (macro[H2_RFINU]!=NULL) hybrid_r=2;
        if (macro[H4_RFINU]!=NULL) hybrid_r=4;
    
        if (hybrid)
        {
            printf("Found hybrid macros - max step size = %d\n",hybrid);
            if (PARAM%hybrid!=0)
            {
                printf("Warning - %d should be a multiple of %d for hybrid method\n",PARAM,hybrid);
                hybrid=0;
            }
        }
        
        if (hybrid_b)
        {
            printf("Found hybrid macros for binary case - max step size = %d\n",hybrid_b);
            if (PARAM%hybrid_b!=0)
            {
                printf("Warning - %d should be a multiple of %d for hybrid method\n",PARAM,hybrid_b);
                hybrid_b=0;
            }
        }
    
        if ((scheduled && hybrid) || (scheduled && hybrid_b))
        {
            printf("Error - scheduling not supported in file %s\n",fname);
            exit(0);
        }
    
    /* Insert macros into dotc file */
        
        while (1)
        {
            if (fgets(line,132,templat)==NULL) break;
            fputs(line,dotc);
            if (strncmp(line,"/***",4)==0)
            {
                    ptr=4; i=0;
                    ptr=skip(line,ptr);
                    while (!white(line[ptr])) name[i++]=line[ptr++];
                    name[i]='\0';
    
                    index=which(name,functions);
                  /*  printf("Recognize %s index %d\n",name,index);  */ 
                    if (index<0)
                    {
                        error=TRUE;
                        break;
                    }
                    insert(index,dotc);
            }
        }
        
        if (error)
            printf("no such function - %s\n",name);
       
        fclose(templat);
        fclose(dotc);
        return 0;
    }
    
    

    8080.miracl.h

     



  • The mrcomba.c file should be generated, given it is not included with the Miracl library created by Certivox. Thanks.

    Mario Pinto.