Changeset 14198


Ignore:
Timestamp:
Nov 27, 2019 1:37:21 PM (10 days ago)
Author:
Jonathan Kämpe
Message:

#5883 Refactoring

Location:
branches/dev-jk-2720
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/dev-jk-2720/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenAlgorithms.jrag

    r14183 r14198  
    1616aspect CCodeGenAlgorithms {
    1717
     18    interface AssignPrintable_C {
     19        void genTempArg(CodePrinter.StepPrinter p, CodeStream str, String indent);
     20        boolean shouldBeDifferentiated();
     21        String assignMacroType();
     22        boolean isImmutable();
     23       
     24        ASTNode asASTNode(); // Workaround when transferring to frameworks that does not use interfaces yet.
     25    }
     26   
     27    FAbstractVariable implements AssignPrintable_C;
     28    FExp              implements AssignPrintable_C;
     29
    1830    /*
    1931     * Hook for printing assignment
     
    2133   
    2234    public class CodePrinter {
    23         public abstract void printAssign(FType type, CodeStream str, String indent, ASTNode left, ASTNode right);
     35        public abstract void printAssign(FType type, CodeStream str, String indent, AssignPrintable_C dst, AssignPrintable_C src);
    2436    }
    2537
    2638    public class CPrettyPrinter {
    2739        @Override
    28         public void printAssign(FType type, CodeStream str, String indent, ASTNode left, ASTNode right) {
    29             type.printAssign(ExecStep, str, indent, left, right);
     40        public void printAssign(FType type, CodeStream str, String indent, AssignPrintable_C dst, AssignPrintable_C src) {
     41            type.printAssign(ExecStep, str, indent, dst, src);
    3042        }
    3143    }
    3244
    3345    public void FType.printAssign(CodePrinter.ExecuteCodePrinter p, CodeStream str, String indent,
    34             ASTNode dst, ASTNode src) {
    35         if (isArray() && (dst.memCpy_C() || src.memCpy_C())) {
     46            AssignPrintable_C dst, AssignPrintable_C src) {
     47        if (isComposite() || isString()) {
    3648            printAssignMacro(p, str, indent, dst, src);
    3749        } else {
     
    4052    }
    4153
    42     syn boolean ASTNode.memCpy_C() = false;
    43     eq FAccessExp.memCpy_C() = !getFAccess().myTopFV().isImmutable();
    44 
    45     @Override
    46     public void FStringType.printAssign(CodePrinter.ExecuteCodePrinter p, CodeStream str, String indent,
    47             ASTNode dst, ASTNode src) {
    48         printAssignMacro(p, str, indent, dst, src);
    49     }
    50 
    5154    public void FType.printAssignMacro(CodePrinter.ExecuteCodePrinter p, CodeStream str, String indent,
    52             ASTNode dst, ASTNode src) {
     55            AssignPrintable_C dst, AssignPrintable_C src) {
     56        final boolean deref = isRecord() && isScalar();
     57       
    5358        str.print(indent);
    5459        str.print("JMI_ASG(");
    55         str.print(dst.assignMacroType(this));
     60        if (dst.isImmutable() && src.isImmutable()) {
     61            str.print("REF");
     62        } else {
     63            str.print(dst.assignMacroType());
     64        }
    5665        str.print(", ");
    57         p.print(dst, str, indent);
    58         str.print(", ");
    59         if (isArray()) {
    60             src.genTempArg(p, str, indent);
    61         } else {
    62             p.print(src, str, indent);
    63         }
    64         str.print(")\n");
    65     }
    66    
    67     public void FType.printAssignValue(CodePrinter.ExecuteCodePrinter p, CodeStream str, String indent,
    68             ASTNode dst, ASTNode src) {
    69         str.print(indent);
    70         boolean deref = dst.deref_C();
    7166        if (deref) {
    7267            str.print("*");
    7368        }
    74         p.print(dst, str, indent);
    75         str.print(" = ");
     69        dst.genTempArg(p, str, indent);
     70        str.print(", ");
    7671        if (deref) {
    7772            str.print("*");
    7873        }
    79         p.print(src, str, indent);
     74        src.genTempArg(p, str, indent);
     75        str.print(")\n");
     76    }
     77   
     78   
     79    public void FType.printAssignValue(CodePrinter.ExecuteCodePrinter p, CodeStream str, String indent,
     80            AssignPrintable_C dst, AssignPrintable_C src) {
     81        str.print(indent);
     82        p.print(dst.asASTNode(), str, indent);
     83        str.print(" = ");
     84        p.print(src.asASTNode(), str, indent);
    8085        str.print(";", "\n");
    8186    }
    8287
    83     syn boolean ASTNode.deref_C() = false;
    84     eq FAccessExp.deref_C() = type().isRecord() && hasFArraySubscripts();
    85 
    86     syn String ASTNode.assignMacroType(FType type) = type.macroType();
    87     eq FAccessExp.assignMacroType(FType type)       = myFV().assignMacroType(type);
    88     eq FVariable.assignMacroType(FType type)       = isString() && !inRecord() ? "STR_Z" : super.assignMacroType(type);
     88    @Override
     89    public ASTNode FAbstractVariable.asASTNode() {
     90        return this;
     91    }
     92   
     93    @Override
     94    public ASTNode FExp.asASTNode() {
     95        return this;
     96    }
     97
     98
     99    @Override
     100    public String FAbstractVariable.assignMacroType() {
     101        return assignMacroType(type());
     102    }
     103   
     104    @Override
     105    public String FExp.assignMacroType() {
     106        return type().macroType();
     107    }
     108   
     109    @Override
     110    public String FAccessExp.assignMacroType() {
     111        return myFV().assignMacroType(type());
     112    }
     113
     114    syn String FAbstractVariable.assignMacroType(FType type);
     115    eq FAbstractVariable.assignMacroType(FType type) = type.macroType();
     116    eq FVariable        .assignMacroType(FType type) = isString() && !inRecord() ? "STR_Z" : type.macroType();
    89117
    90118    /*
     
    212240    public void FVariable.algorithmInit(CodePrinter.ExecuteCodePrinter p, CodeStream str, String indent) {
    213241        if (isString()) {
    214             str.print(indent, "JMI_ASG(", assignMacroType(type()), ", ", p.name(this), ", ");
     242            str.print(indent, "JMI_ASG(", assignMacroType(), ", ", p.name(this), ", ");
    215243        } else {
    216244            str.print(indent, p.name(this), " = ");
     
    253281
    254282    public void FAssignStmt.genVarDecls_C(CodePrinter p, CodeStream str, String indent) {
    255         if (getRight().isArray()) {
    256             getRight().genTempArg(p.DeclStep, str, indent);
    257         } else {
    258             super.genVarDecls_C(p, str, indent);
    259         }
    260     }
    261 
    262     public void FAssignStmt.genTempVars_C(CodePrinter p, CodeStream str, String indent) {
    263         if (getRight().isArray()) {
    264             getRight().genTempArg(p.PreStep, str, indent);
    265         } else {
    266             super.genTempVars_C(p, str, indent);
    267         }
    268     }
    269 
    270     public void FAssignStmt.genTempFree_C(CodePrinter p, CodeStream str, String indent) {
    271         if (getRight().isArray()) {
    272             getRight().genTempArg(p.PostStep, str, indent);
    273         } else {
    274             super.genTempFree_C(p, str, indent);
    275         }
     283        p.DeclStep.printAssign(getLeft().type(), str, indent, getLeft(), getRight());
    276284    }
    277285
    278286    @Override
    279287    public void FAssignStmt.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    280         p.printPreSteps(this, str, indent);
    281         p.printAssign(getLeft().type(), str, indent, getLeft(), getRight());
    282         p.printPostSteps(this, str, indent);
     288        p.PreStep.printAssign (getLeft().type(), str, indent, getLeft(), getRight());
     289        p.printAssign         (getLeft().type(), str, indent, getLeft(), getRight());
     290        p.PostStep.printAssign(getLeft().type(), str, indent, getLeft(), getRight());
    283291    }
    284292
  • branches/dev-jk-2720/Compiler/ModelicaCBackEnd/src/jastadd/CodeGen/StepPrinter.jrag

    r13640 r14198  
    2424            public void print(CodeStream str, String s) {
    2525               
     26            }
     27            public void printAssign(FType type, CodeStream str, String indent, AssignPrintable_C dst, AssignPrintable_C src) {
     28                if (type.isComposite() || type.isString()) {
     29                    dst.genTempArg(this, str, indent);
     30                    src.genTempArg(this, str, indent);
     31                } else {
     32                    print(dst.asASTNode(), str, indent);
     33                    print(src.asASTNode(), str, indent);
     34                }
    2635            }
    2736        }
     
    157166    }
    158167   
     168    @Override
     169    public void FAbstractVariable.genTempArg(CodePrinter.StepPrinter p, CodeStream str, String indent) {
     170        p.print(this, str, indent);
     171    }
     172   
     173    @Override
    159174    public void FExp.genTempArg(CodePrinter.StepPrinter p, CodeStream str, String indent) {
    160175        p.printIO(this, str, indent);
    161176    }
    162177   
     178    @Override
     179    public void FGlobalAccessExp.genTempArg(CodePrinter.StepPrinter p, CodeStream str, String indent) {
     180        if (isFunctionCallArg()) {
     181            p.printIO(this, str, indent);
     182        } else {
     183            p.print(this, str, indent);
     184        }
     185    }
     186   
     187    @Override
    163188    public void FIfExp.genTempArg(CodePrinter.StepPrinter p, CodeStream str, String indent) {
    164189        p.print(this, str, indent);
  • branches/dev-jk-2720/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenArrayTests.mo

    r14004 r14198  
    766766    jmi_array_ref_1(temp_2_a, 2) = 2;
    767767    JMI_ARRAY_INIT_1(STACK, jmi_string_t, jmi_string_array_t, temp_3_a, 1, 1, 1)
    768     JMI_ASG(STR, jmi_array_ref_1(temp_3_a, 1), s_v)
    769     jmi_array_rec_1(temp_1_a, 1)->x = temp_2_a;
    770     JMI_ASG(STR_ARR, jmi_array_rec_1(temp_1_a, 1)->s, temp_3_a)
     768    JMI_ASG(REF, jmi_array_ref_1(temp_3_a, 1), s_v)
     769    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 1)->x, temp_2_a)
     770    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 1)->s, temp_3_a)
    771771    JMI_ARRAY_INIT_1(STACK, jmi_real_t, jmi_array_t, temp_4_a, 1, 1, 1)
    772772    jmi_array_ref_1(temp_4_a, 1) = _time;
     
    780780    snprintf(JMI_STR_END(tmp_2), JMI_STR_LEFT(tmp_2), \"%s\", \"s3\");
    781781    JMI_ASG(STR, jmi_array_ref_1(temp_5_a, 2), tmp_2)
    782     jmi_array_rec_1(temp_1_a, 2)->x = temp_4_a;
    783     JMI_ASG(STR_ARR, jmi_array_rec_1(temp_1_a, 2)->s, temp_5_a)
     782    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 2)->x, temp_4_a)
     783    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 2)->s, temp_5_a)
    784784    y_v = func_CCodeGenArrayTests_RecordArray10_f_exp1(temp_1_a);
    785785    JMI_RET(GEN, y_o, y_v)
     
    835835    return ef;
    836836}
    837 
    838837")})));
    839838end RecordArray10;
  • branches/dev-jk-2720/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenCompositeStatementTests.mo

    r14183 r14198  
    3232        R[:] r = f(R(time));
    3333
    34 annotation(__JModelica(UnitTesting(tests={
    35     CCodeGenTestCase(
    36         name="RecordStmt1",
    37         description="",
    38         template="
    39 $C_functions$
    40 ",
    41         generatedCode="
     34    annotation(__JModelica(UnitTesting(tests={
     35        CCodeGenTestCase(
     36            name="RecordStmt1",
     37            description="",
     38            template="$C_functions$",
     39            generatedCode="
    4240void func_CCodeGenCompositeStatementTests_RecordStmt1_f_def0(R_0_r* r_v, R_0_ra* y_a) {
    4341    JMI_DYNAMIC_INIT()
     
    5250    }
    5351    JMI_ARRAY_INIT_1(STACK, R_0_r, R_0_ra, temp_1_a, 2, 1, 2)
    54     *jmi_array_rec_1(temp_1_a, 1) = *JMI_GLOBAL(CCodeGenCompositeStatementTests_RecordStmt1_f_c);
    55     *jmi_array_rec_1(temp_1_a, 2) = *r_v;
     52    JMI_ASG(REF, *jmi_array_rec_1(temp_1_a, 1), *JMI_GLOBAL(CCodeGenCompositeStatementTests_RecordStmt1_f_c))
     53    JMI_ASG(REF, *jmi_array_rec_1(temp_1_a, 2), *r_v)
    5654    i1_0in = 0;
    5755    i1_0ie = floor((2) - (1));
     
    6260    return;
    6361}
     62
    6463")})));
    6564    end RecordStmt1;
     
    103102    }
    104103    JMI_ARRAY_INIT_1(STACK, R_0_r, R_0_ra, temp_1_a, 2, 1, 2)
    105     *jmi_array_rec_1(temp_1_a, 1) = *JMI_GLOBAL(CCodeGenCompositeStatementTests_RecordStmt2_f_c);
    106     *jmi_array_rec_1(temp_1_a, 2) = *r_v;
     104    JMI_ASG(REF, *jmi_array_rec_1(temp_1_a, 1), *JMI_GLOBAL(CCodeGenCompositeStatementTests_RecordStmt2_f_c))
     105    JMI_ASG(REF, *jmi_array_rec_1(temp_1_a, 2), *r_v)
    107106    i1_0in = 0;
    108107    i1_0ie = floor((2) - (1));
     
    190189    JMI_ASG(GEN_ARR, jmi_array_rec_1(temp_2_a, 1)->r->r->x, c_v->r->r->x)
    191190    jmi_array_rec_1(temp_2_a, 1)->r->x = c_v->r->x;
    192     *jmi_array_rec_1(temp_2_a, 2) = *r_v;
     191    JMI_ASG(REF, *jmi_array_rec_1(temp_2_a, 2), *r_v)
    193192    i1_0in = 0;
    194193    i1_0ie = floor((2) - (1));
     
    241240    }
    242241    JMI_ARRAY_INIT_1(STACK, R1_0_r, R1_0_ra, temp_1_a, 1, 1, 1)
    243     jmi_array_rec_1(temp_1_a, 1)->x = JMI_GLOBAL(CCodeGenCompositeStatementTests_RecordStmt4_f_c);
     242    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 1)->x, JMI_GLOBAL(CCodeGenCompositeStatementTests_RecordStmt4_f_c))
    244243    i1_0in = 0;
    245244    i1_0ie = floor((1) - (1));
     
    303302    JMI_ARRAY_INIT_1(STACK, R2_1_r, R2_1_ra, temp_1_a, 1, 1, 1)
    304303    JMI_ARRAY_INIT_1(STACK, R1_0_r, R1_0_ra, temp_2_a, 1, 1, 1)
    305     jmi_array_rec_1(temp_2_a, 1)->x = JMI_GLOBAL(CCodeGenCompositeStatementTests_RecordStmt5_f_c);
    306     jmi_array_rec_1(temp_1_a, 1)->r1 = temp_2_a;
     304    JMI_ASG(REF, jmi_array_rec_1(temp_2_a, 1)->x, JMI_GLOBAL(CCodeGenCompositeStatementTests_RecordStmt5_f_c))
     305    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 1)->r1, temp_2_a)
    307306    i1_0in = 0;
    308307    i1_0ie = floor((1) - (1));
  • branches/dev-jk-2720/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenTests.mo

    r14173 r14198  
    65376537    jmi_array_rec_1(temp_2_a, 2)->c = 3;
    65386538    jmi_array_rec_1(temp_1_a, 1)->a = 1;
    6539     jmi_array_rec_1(temp_1_a, 1)->b = temp_2_a;
     6539    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 1)->b, temp_2_a)
    65406540    JMI_ARRAY_INIT_1(STACK, B_0_r, B_0_ra, temp_3_a, 2, 1, 2)
    65416541    jmi_array_rec_1(temp_3_a, 1)->c = 5;
    65426542    jmi_array_rec_1(temp_3_a, 2)->c = 6;
    65436543    jmi_array_rec_1(temp_1_a, 2)->a = 4;
    6544     jmi_array_rec_1(temp_1_a, 2)->b = temp_3_a;
     6544    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 2)->b, temp_3_a)
    65456545    JMI_ARRAY_INIT_1(STACK, B_0_r, B_0_ra, temp_4_a, 2, 1, 2)
    65466546    jmi_array_rec_1(temp_4_a, 1)->c = 8;
    65476547    jmi_array_rec_1(temp_4_a, 2)->c = 9;
    65486548    jmi_array_rec_1(temp_1_a, 3)->a = 7;
    6549     jmi_array_rec_1(temp_1_a, 3)->b = temp_4_a;
     6549    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 3)->b, temp_4_a)
    65506550    i1_0in = 0;
    65516551    i1_0ie = floor((3) - (1));
     
    67576757 A x[3] = f();
    67586758
    6759     annotation(__JModelica(UnitTesting(tests={
    6760         CCodeGenTestCase(
    6761             name="CRecordDecl12",
    6762             description="C code generation for records: outputs: array of records",
    6763             variability_propagation=false,
    6764             inline_functions="none",
    6765             generate_ode=false,
    6766             generate_dae=true,
    6767             template="
     6759annotation(__JModelica(UnitTesting(tests={
     6760    CCodeGenTestCase(
     6761        name="CRecordDecl12",
     6762        description="C code generation for records: outputs: array of records",
     6763        variability_propagation=false,
     6764        inline_functions="none",
     6765        generate_ode=false,
     6766        generate_dae=true,
     6767        template="
    67686768$C_function_headers$
    67696769$C_functions$
    67706770$C_DAE_equation_residuals$
    67716771",
    6772             generatedCode="
     6772        generatedCode="
    67736773void func_CCodeGenTests_CRecordDecl12_f_def0(A_1_ra* x_a);
    67746774
     
    68046804    jmi_array_rec_1(temp_2_a, 2)->c = 3;
    68056805    jmi_array_rec_1(temp_1_a, 1)->a = 1;
    6806     jmi_array_rec_1(temp_1_a, 1)->b = temp_2_a;
     6806    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 1)->b, temp_2_a)
    68076807    JMI_ARRAY_INIT_1(STACK, B_0_r, B_0_ra, temp_3_a, 2, 1, 2)
    68086808    jmi_array_rec_1(temp_3_a, 1)->c = 5;
    68096809    jmi_array_rec_1(temp_3_a, 2)->c = 6;
    68106810    jmi_array_rec_1(temp_1_a, 2)->a = 4;
    6811     jmi_array_rec_1(temp_1_a, 2)->b = temp_3_a;
     6811    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 2)->b, temp_3_a)
    68126812    JMI_ARRAY_INIT_1(STACK, B_0_r, B_0_ra, temp_4_a, 2, 1, 2)
    68136813    jmi_array_rec_1(temp_4_a, 1)->c = 8;
    68146814    jmi_array_rec_1(temp_4_a, 2)->c = 9;
    68156815    jmi_array_rec_1(temp_1_a, 3)->a = 7;
    6816     jmi_array_rec_1(temp_1_a, 3)->b = temp_4_a;
     6816    JMI_ASG(REF, jmi_array_rec_1(temp_1_a, 3)->b, temp_4_a)
    68176817    i1_0in = 0;
    68186818    i1_0ie = floor((3) - (1));
  • branches/dev-jk-2720/Compiler/ModelicaMiddleEnd/src/jastadd/scalarization/ScalarizeAlgorithms.jrag

    r14173 r14198  
    174174   
    175175    syn boolean FExp.keepCompositeAssign() = useTempVar && indexNames == null;
    176     eq FAccessExp.keepCompositeAssign() = !isSlice() && (!myFV().isRecord() || getFAccess().myTopFV().isImmutable());
     176    eq FAccessExp.keepCompositeAssign() = !isSlice() && (!myFV().isRecord() || isImmutable());
    177177    eq FTempAccessExp.keepCompositeAssign() = indexNames == null;
     178   
     179    syn boolean FExp.isImmutable() = false;
     180    eq FAccessExp.isImmutable()    = getFAccess().myTopFV().isImmutable();
    178181   
    179182    syn boolean FAbstractVariable.isImmutable() = isConstant();
  • branches/dev-jk-2720/Compiler/ModelicaMiddleEnd/test/modelica/Differentiation.mo

    r14173 r14198  
    31993199    jmi_array_rec_1(rt_a, 1)->x = tmp_1;
    32003200    JMI_ARRAY_INIT_1(STACK, R_0_r, R_0_ra, temp_1_a, 1, 1, 1)
    3201     *jmi_array_rec_1(temp_1_a, 1) = *jmi_array_rec_1(r_a, 1);
     3201    JMI_ASG(REF, *jmi_array_rec_1(temp_1_a, 1), *jmi_array_rec_1(r_a, 1))
    32023202    i1_0in = 0;
    32033203    i1_0ie = floor((1) - (1));
     
    32803280    JMI_ARRAY_INIT_1(STACK, R_0_r, R_0_ra, temp_1_a, 1, 1, 1)
    32813281    JMI_ARRAY_INIT_1(STACK, R_0_r, R_0_ra, _der_temp_1_a, 1, 1, 1)
    3282     *jmi_array_rec_1(_der_temp_1_a, 1) = *jmi_array_rec_1(_der_r_a, 1);
    3283     *jmi_array_rec_1(temp_1_a, 1) = *jmi_array_rec_1(r_a, 1);
     3282    JMI_ASG(REF, *jmi_array_rec_1(_der_temp_1_a, 1), *jmi_array_rec_1(_der_r_a, 1))
     3283    JMI_ASG(REF, *jmi_array_rec_1(temp_1_a, 1), *jmi_array_rec_1(r_a, 1))
    32843284    i1_4in = 0;
    32853285    i1_4ie = floor((1) - (1));
  • branches/dev-jk-2720/RuntimeLibrary/src/jmi/jmi_array_none.h

    r14174 r14198  
    349349#define JMI_ASG(TYPE, DEST, SRC) \
    350350    JMI_ASG_##TYPE(DEST, SRC)
     351#define JMI_ASG_REF(DEST, SRC) \
     352    DEST = SRC;
    351353#define JMI_ASG_GEN(DEST, SRC) \
    352354    DEST = SRC;
Note: See TracChangeset for help on using the changeset viewer.