Changeset 13892


Ignore:
Timestamp:
Oct 29, 2019 10:01:04 AM (2 weeks ago)
Author:
randersson
Message:

#5792 Merged r13781-r13856 from trunk to stable

Location:
branches/stable
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • branches/stable

  • branches/stable/.project

    r5080 r13892  
    77    <buildSpec>
    88        <buildCommand>
    9             <name>org.python.pydev.PyDevBuilder</name>
    10             <arguments>
    11             </arguments>
    12         </buildCommand>
    13         <buildCommand>
    149            <name>org.eclipse.jdt.core.javabuilder</name>
    1510            <arguments>
     
    1914    <natures>
    2015        <nature>org.eclipse.jdt.core.javanature</nature>
    21         <nature>org.python.pydev.pythonNature</nature>
    2216    </natures>
    2317</projectDescription>
  • branches/stable/CHANGELOG.txt

    r13771 r13892  
    11================= Unreleased ==================
     2# Fixed ; Minor ; Compiler; #5864
     3Fixed bug where partial variability propagation lead to unbalanced equation systems.
     4
     5# Fixed ; Minor ; Compiler ; #5862
     6Fixed bug where empty array subscripts added during scalarization lead to c-compilation error.
     7
    28# Feature ; Minor ; Compiler; #5837
    39Added a pre-compiled evaluator used for evaluating external functions
  • branches/stable/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenExpressions.jrag

    r13433 r13892  
    13531353    }
    13541354   
    1355     /**
    1356      * Generate the initialization of delay blocks.
    1357      */
    1358     public void FDelayExp.genInit_C(CodePrinter p, CodeStream str, String indent) {
    1359         FExp maxDelayExp = myMaxDelayExp();
     1355    private void FClass.genDelayInitVarDecls_C(CodePrinter p, CodeStream str, String indent) { // Hook to facilitate extensions
     1356        for (FDelayExp d : myDelayExps()) {
     1357            d.genInitVarDecls_C(p, str, indent);
     1358        }
     1359        for (FSpatialDistExp d : mySpatialDistExps()) {
     1360            d.genInitVarDecls_C(p, str, indent);
     1361        }
     1362    }
     1363
     1364    private void FClass.genDelayInitAssignments_C(CodePrinter p, CodeStream str, String indent) { // Hook to facilitate extensions
     1365        for (FDelayExp d : myDelayExps()) {
     1366            d.genInit_C(p, str, indent);
     1367        }
     1368        for (FSpatialDistExp d : mySpatialDistExps()) {
     1369            d.genInit_C(p, str, indent);
     1370        }
     1371    }
     1372   
     1373    public void FClass.genDelayInit_C(CodeStream genPrinter) {
     1374        CodePrinter p = ASTNode.printer_C;
     1375        String indent = p.indent("");
     1376        genDelayInitVarDecls_C(p, genPrinter, indent);
     1377        genDelayInitAssignments_C(p, genPrinter, indent);
     1378    }
     1379
     1380    private void FDelayExp.prepareInit_C(CodePrinter p, CodeStream str, String indent, int delayIndex) {
     1381        FExp maxDelayExp = myMaxDelayExp();
    13601382        boolean fixed = isTimeEventGenerating();
    1361         p.printPreSteps(getFExp(), str, indent);
     1383        p.printPreSteps(getFExp(), str, indent);
    13621384        p.printPreSteps(maxDelayExp, str, indent);
    1363        
    1364         str.format("%sjmi_delay_init(jmi, %d, ", indent, myDelayIndex());
     1385        str.format("%sjmi_delay_init(jmi, %d, ", indent, delayIndex);
    13651386        str.print(boolValue_C(fixed)); // jmi_boolean fixed
    13661387        str.print(", ");
     
    13681389        str.print(", ");
    13691390        p.print(fixed ? getDelay() : maxDelayExp, str, indent); // jmi_real_t max_delay
    1370         str.print(", ");
    1371         p.print(getFExp(), str, indent); // jmi_real_t y0
    1372         str.println(");");
    1373        
     1391        str.print(", ");
     1392
     1393    }
     1394
     1395    private void FDelayExp.finalizeInit_C(CodePrinter p, CodeStream str, String indent) {
     1396        str.println(");");
    13741397        p.printPostSteps(getFExp(), str, indent);
    1375         p.printPostSteps(maxDelayExp, str, indent);
     1398        p.printPostSteps(myMaxDelayExp(), str, indent);
     1399    }
     1400   
     1401    /**
     1402     * Generate the initialization of delay blocks.
     1403     */
     1404    public void FDelayExp.genInit_C(CodePrinter p, CodeStream str, String indent) {
     1405        prepareInit_C(p, str, indent, myDelayIndex());
     1406        p.print(getFExp(), str, indent); // jmi_real_t y0
     1407        finalizeInit_C(p, str, indent);
    13761408    }
    13771409    syn FExp FDelayExp.myMaxDelayExp() = hasMax() ? getMax() : getDelay();
  • branches/stable/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CGenerator.jrag

    r12423 r13892  
    2121
    2222import java.io.*;
     23
     24aspect CGenerator {
    2325
    2426public class CGenerator extends GenericGenerator {
     
    12461248       
    12471249        public void generate(CodeStream genPrinter) {
    1248             genPrinter.print(fclass.myDelayExps().size());
     1250            genPrinter.print(fclass.numberOfDelaysInCCode());
    12491251        }
    12501252    }
     
    13041306       
    13051307        public void generate(CodeStream genPrinter) {
    1306             CodePrinter p = ASTNode.printer_C;
    1307             String indent = p.indent("");
    1308             for (FDelayExp d : fclass.myDelayExps()) {
    1309                 d.genInitVarDecls_C(p, genPrinter, indent);
    1310             }
    1311             for (FSpatialDistExp d : fclass.mySpatialDistExps()) {
    1312                 d.genInitVarDecls_C(p, genPrinter, indent);
    1313             }
    1314             for (FDelayExp d : fclass.myDelayExps()) {
    1315                 d.genInit_C(p, genPrinter, indent);
    1316             }
    1317             for (FSpatialDistExp d : fclass.mySpatialDistExps()) {
    1318                 d.genInit_C(p, genPrinter, indent);
    1319             }
     1308            fclass.genDelayInit_C(genPrinter);
    13201309        }
    13211310    }
     
    15781567    }
    15791568}
     1569
     1570    syn int FClass.numberOfDelaysInCCode() = myDelayExps().size(); // Hook to facilitate extensions
     1571}
  • branches/stable/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenArrayTests.mo

    r12857 r13892  
    941941end RecordArray13;
    942942
     943model RecordArray14
     944    record R
     945        Real x = 1;
     946    end R;
     947   
     948    function f
     949        input Integer n;
     950        Real[n] xs;
     951        R[n] rs;
     952        output Real y;
     953    algorithm
     954        xs := rs.x;
     955        y := sum(xs);
     956        annotation(Inline=false);
     957    end f;
     958
     959    Real y = f(integer(time));
     960   
     961annotation(__JModelica(UnitTesting(tests={
     962    CCodeGenTestCase(
     963        name="RecordArray14",
     964        description="Test for bug in #5862",
     965        template="$C_functions$",
     966        generatedCode="
     967void func_CCodeGenArrayTests_RecordArray14_f_def0(jmi_real_t n_v, jmi_real_t* y_o) {
     968    JMI_DYNAMIC_INIT()
     969    JMI_ARR(HEAP, jmi_real_t, jmi_array_t, xs_a, -1, 1)
     970    JMI_ARR(HEAP, R_0_r, R_0_ra, rs_a, -1, 1)
     971    JMI_DEF(REA, tmp_1)
     972    JMI_DEF(REA, tmp_1_max)
     973    JMI_DEF(REA, y_v)
     974    JMI_DEF(REA, temp_1_v)
     975    jmi_real_t i1_0i;
     976    jmi_int_t i1_0ie;
     977    jmi_int_t i1_0in;
     978    jmi_real_t i1_1i;
     979    jmi_int_t i1_1ie;
     980    jmi_int_t i1_1in;
     981    jmi_real_t i1_2i;
     982    jmi_int_t i1_2ie;
     983    jmi_int_t i1_2in;
     984    JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, xs_a, n_v, 1, n_v)
     985    JMI_ARRAY_INIT_1(HEAP, R_0_r, R_0_ra, rs_a, n_v, 1, n_v)
     986    tmp_1_max = n_v + 1;
     987    for (tmp_1 = 1; tmp_1 < tmp_1_max; tmp_1++) {
     988    }
     989    i1_0in = 0;
     990    i1_0ie = floor((n_v) - (1));
     991    for (i1_0i = 1; i1_0in <= i1_0ie; i1_0i = 1 + (++i1_0in)) {
     992        jmi_array_rec_1(rs_a, i1_0i)->x = 1;
     993    }
     994    i1_1in = 0;
     995    i1_1ie = floor((n_v) - (1));
     996    for (i1_1i = 1; i1_1in <= i1_1ie; i1_1i = 1 + (++i1_1in)) {
     997        jmi_array_ref_1(xs_a, i1_1i) = jmi_array_rec_1(rs_a, i1_1i)->x;
     998    }
     999    temp_1_v = 0.0;
     1000    i1_2in = 0;
     1001    i1_2ie = floor((n_v) - (1));
     1002    for (i1_2i = 1; i1_2in <= i1_2ie; i1_2i = 1 + (++i1_2in)) {
     1003        temp_1_v = temp_1_v + jmi_array_val_1(xs_a, i1_2i);
     1004    }
     1005    y_v = temp_1_v;
     1006    JMI_RET(GEN, y_o, y_v)
     1007    JMI_DYNAMIC_FREE()
     1008    return;
     1009}
     1010
     1011jmi_real_t func_CCodeGenArrayTests_RecordArray14_f_exp0(jmi_real_t n_v) {
     1012    JMI_DEF(REA, y_v)
     1013    func_CCodeGenArrayTests_RecordArray14_f_def0(n_v, &y_v);
     1014    return y_v;
     1015}
     1016")})));
     1017end RecordArray14;
     1018
    9431019end CCodeGenArrayTests;
  • branches/stable/Compiler/ModelicaCompiler/src/jastadd/ModelicaCompiler.jrag

    r13771 r13892  
    20452045            InstClassDecl icl = instantiateModel(name, cl, target);
    20462046            UtilInterface util = icl.root().getUtilInterface();
     2047            String flatName = null;
    20472048            if (compileTo != null) {
    20482049                Path unitFile = makePackagingDirs(cl, compileTo, target);
    20492050                util.setCompilationOutputPath(unitFile);
     2051                flatName = computeFlatName(compileTo, util);
    20502052            }
    2051            
    2052             String flatName = computeFlatName(compileTo, util);
    20532053           
    20542054            // flattening
     
    22802280    private String ModelicaCompiler.computeFlatName(Path compileTo, UtilInterface util) {
    22812281        String flatName = null;
    2282         if (compileTo != null && !Files.isDirectory(compileTo)) {
     2282        if (!Files.isDirectory(compileTo)) {
    22832283            flatName = compileTo.getFileName().toString();
    22842284            int i = flatName.lastIndexOf('.');
  • branches/stable/Compiler/ModelicaFlatTree/src/jastadd/PrettyPrint.jrag

    r13661 r13892  
    14061406   
    14071407    public void FArraySubscripts.prettyPrint(Printer p, CodeStream str, String indent) {
    1408         if (numSubscript()>0) {
    1409             str.print("[");
    1410             for (int i=0;i<numSubscript();i++) {
    1411                 subscript(i).prettyPrint(p, str, indent);
    1412                 if (i<numSubscript()-1)
    1413                     str.print(",");
    1414             }
    1415             str.print("]");
    1416         }
     1408        str.print("[");
     1409        for (int i = 0; i < numSubscript(); i++) {
     1410            subscript(i).prettyPrint(p, str, indent);
     1411            if (i < numSubscript() - 1) {
     1412                str.print(",");
     1413            }
     1414        }
     1415        str.print("]");
    14171416    }
    14181417
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/util/Util.jrag

    r13504 r13892  
    15841584
    15851585    syn boolean SrcBaseNode.isLibNode() = false;
    1586     eq SrcLibNode.isLibNode()            = true;
     1586    eq SrcLibNode.isLibNode()           = true;
     1587    syn SrcLibNode SrcBaseNode.asSrcLibNode() {
     1588        throw new UnsupportedOperationException();
     1589    }
     1590    syn SrcLibNode SrcLibNode.asSrcLibNode() = this;
    15871591}
    15881592
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/common/evaluation/ExternalFunctionExecutableGenerated.java

    r13771 r13892  
    1717    @Override
    1818    public void remove() {
    19         new File(executable).delete();
     19        File file = new File(executable);
     20        boolean success = file.delete();
     21        // The first attempt to delete may fail if the process has not terminated yet.
     22        // Possibly not necessary since LiveExternalFunction.destroyProcess() now calls ProcessCommunicator.teardown().
     23        if (!success) {
     24            try {
     25                Thread.sleep(10); // Sleep some arbitrary duration to give the process time to die.
     26            } catch (InterruptedException e) {
     27                // Ignore
     28            }
     29            success = file.delete();
     30        }
    2031    }
    2132}
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/common/evaluation/ExternalFunctionImpl.java

    r13771 r13892  
    4545            setup(ext, values, timeout, com);
    4646            evaluate(ext, values, timeout, com);
    47             return teardown(timeout, com);
     47            return com.teardown(timeout);
    4848        } finally {
    4949            if (com != null) {
     
    7979        com.accept("READY");
    8080        com.cancelTimer();
    81     }
    82 
    83     public int teardown(int timeout, ProcessCommunicator<V, T> com) throws IOException {
    84         com.startTimer(timeout);
    85         com.check("EXIT");
    86         com.accept("END");
    87         int result = com.end();
    88         com.cancelTimer();
    89         // log().debug("SUCCESS TEARDOWN");
    90         return result;
    9181    }
    9282
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/common/evaluation/ExternalProcessCacheImpl.java

    r13771 r13892  
    55import java.io.PrintStream;
    66import java.util.ArrayList;
     7import java.util.Arrays;
     8import java.util.Collection;
    79import java.util.HashMap;
    810import java.util.HashSet;
     
    8082    }
    8183   
    82     private static ArrayList<String> builtinExternalFunctions = new ArrayList<String>() {{
    83         add("ModelicaStrings_substring");
    84         add("ModelicaStrings_length");
    85         add("ModelicaStrings_skipWhiteSpace");
    86         add("ModelicaStrings_compare");
    87     }};
    88    
    89     private static ArrayList<String> supportedSignatures = new ArrayList<String>() {{
    90         add("d+d,d,");
    91         add("d+i,");
    92         add("d+i,d,d,");
    93         add("s+s,i,i,");
    94         add("i+s,");
    95         add("i+s,i,");
    96         add("i+s,s,i,");
    97         add("i+i,i,");
    98         add("void+i,d,d,*R[d,d,d,d,d,d,d,d,d,d,d,],");
    99         add("void+d,d,*d,");
    100     }};
     84    private static Collection<String> builtinExternalFunctions = Arrays.asList(
     85        "ModelicaStrings_substring",
     86        "ModelicaStrings_length",
     87        "ModelicaStrings_skipWhiteSpace",
     88        "ModelicaStrings_compare"
     89    );
     90   
     91    private static Collection<String> supportedSignatures = Arrays.asList(
     92        "d+d,d,",
     93        "d+i,",
     94        "d+i,d,d,",
     95        "s+s,i,i,",
     96        "i+s,",
     97        "i+s,i,",
     98        "i+s,s,i,",
     99        "i+i,i,",
     100        "void+i,d,d,*R[d,d,d,d,d,d,d,d,d,d,d,],",
     101        "void+d,d,*d,"
     102    );
    101103   
    102104    public boolean canUseEvaluator(E ext, ArrayList<String> arguments) {
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/common/evaluation/LiveExternalFunction.java

    r13771 r13892  
    4646            compiler.log().debug("Finished evaluating live external function, time: " + time + "ms");
    4747        } catch (ProcessCommunicator.AbortConstantEvaluationException e) {
    48 
     48            // TODO What does this mean?
    4949        } catch (ConstantEvaluationException e) {
    5050            destroyProcess();
     
    8989        if (com != null) {
    9090            livingCachedExternals.remove(this);
    91             com.destroy();
     91            try {
     92                com.teardown(100); // TODO Should we check the return value?
     93            } catch (IOException e) {
     94                // TODO Do we need to do anything here?
     95            }
     96            com.destroy(); // TODO Do we still need to call destroy() if teardown is successful?
    9297            com = null;
    9398        }
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/common/evaluation/ProcessCommunicator.java

    r12940 r13892  
    4949    private String getLine() throws IOException {
    5050        String line = buffLine;
    51         if (line == null)
     51        if (line == null) {
    5252            line = in.readLine();
     53        }
    5354        if (line == null) {
    5455            if (timeOutHappened) {
     
    110111            String format = deserializeString();
    111112            String value = deserializeString();
    112             if (warning != 0)
     113            if (warning != 0) {
    113114                mc.log().warning("%s: " + format, name, value);
    114             else
     115            } else {
    115116                mc.log().verbose("%s: " + format, name, value);
     117            }
    116118            line = getLine();
    117119        }
     
    133135            super(null, string);
    134136        }
     137    }
     138
     139    public int teardown(int timeout) throws IOException {
     140        startTimer(timeout);
     141        check("EXIT");
     142        accept("END");
     143        int result = end();
     144        cancelTimer();
     145        return result;
    135146    }
    136147
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/common/options/AbstractOptionRegistry.java

    r13252 r13892  
    4040 * to get an option registry populated with all available options.
    4141 */
     42@SuppressWarnings("javadoc")
    4243public abstract class AbstractOptionRegistry {
    4344
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/separateProcess/CompilerInstance.java

    r13396 r13892  
    274274         * {@link org.jmodelica.modelica.compiler.ModelicaCompiler ModelicaCompiler}.
    275275         */
     276        @SuppressWarnings("javadoc")
    276277        MODELICA("org.jmodelica.modelica.compiler.ModelicaCompiler"),
    277278
     
    279280         * {@link org.jmodelica.optimica.compiler.OptimicaCompiler OptimicaCompiler}.
    280281         */
     282        @SuppressWarnings("javadoc")
    281283        OPTIMICA("org.jmodelica.optimica.compiler.OptimicaCompiler");
    282284
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/util/MemorySpider.java

    r12940 r13892  
    145145        private Field field;
    146146       
    147         public Object perform(Field f, Object o) {
     147        @SuppressWarnings("deprecation")
     148        public Object perform(Field f, Object o) {
    148149            field = f;
    149150            if (!f.isAccessible())
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/util/logging/PipeLogger.java

    r12984 r13892  
    7272    }
    7373
     74    @SuppressWarnings("deprecation")
    7475    @Override
    7576    protected void finalize() throws Throwable {
  • branches/stable/Compiler/ModelicaMiddleEnd/src/jastadd/optimizations/VariabilityPropagation.jrag

    r12119 r13892  
    2222     */
    2323    syn boolean FAbstractEquation.canPropagate(FClass.VariabilityPropagator propagator) =
    24             canPropagateContext(propagator) && !containsActiveAnnotations();
     24            canPropagateContext(propagator, false) && !containsActiveAnnotations();
    2525    eq FEquation.canPropagate(FClass.VariabilityPropagator propagator) =
    2626            super.canPropagate(propagator) && propagator.canPropagate(this);
     
    2929        return super.canPropagate(propagator) && propagator.variables(this).size() > 0 && numScalarEquations() > 0 &&
    3030                ((propagator.variables(this).size() == numScalarEquations() && getCall().variability().parameterOrLess())
    31                         || potentialPartialVariability().knownParameterOrLess());
     31                        || (potentialPartialVariability().knownParameterOrLess() && canPropagateContext(propagator, true)));
    3232    }
    3333    eq FAlgorithm.canPropagate(FClass.VariabilityPropagator propagator) =
     
    3636            propagator.variables(this).size() == numScalarEquations() && variabilityRHS().parameterOrLess();
    3737
    38     inh boolean FAbstractEquation   .canPropagateContext(FClass.VariabilityPropagator propagator);
    39     eq Root  .getChild()            .canPropagateContext(FClass.VariabilityPropagator propagator) = false;
    40     eq FClass.getFAbstractEquation().canPropagateContext(FClass.VariabilityPropagator propagator) = true;
    41     eq FClass.getFInitialEquation() .canPropagateContext(FClass.VariabilityPropagator propagator) =
     38    inh boolean FAbstractEquation   .canPropagateContext(FClass.VariabilityPropagator propagator, boolean partial);
     39    eq Root  .getChild()            .canPropagateContext(FClass.VariabilityPropagator propagator, boolean partial) = false;
     40    eq FClass.getFAbstractEquation().canPropagateContext(FClass.VariabilityPropagator propagator, boolean partial) = true;
     41    eq FClass.getFInitialEquation() .canPropagateContext(FClass.VariabilityPropagator propagator, boolean partial) =
    4242            propagator.propagateInitial();
    43     eq FIfWhenElseEquation.getChild().canPropagateContext(FClass.VariabilityPropagator propagator) =
    44             isTempAssign() && canPropagateContext(propagator);
     43    eq FIfWhenElseEquation.getChild().canPropagateContext(FClass.VariabilityPropagator propagator, boolean partial) =
     44            isTempAssign() && !partial && canPropagateContext(propagator, partial);
    4545
    4646    /**
  • branches/stable/Compiler/ModelicaMiddleEnd/src/jastadd/scalarization/Scalarization.jrag

    r13357 r13892  
    912912
    913913    public FTempAccessExp FExp.tempExp(String name, Index i) {
    914         FTempAccessExp res;
     914        FAccess access;
    915915        if (inFunction()) {
    916             res = new FTempAccessExp(new FAccessFull(name, i.createFArraySubscripts()));
     916            access = new FAccessFull(name, i.createFArraySubscripts());
    917917        } else {
    918             res = new FTempAccessExp(new FAccessString(name + i));
    919         }
    920         return (FTempAccessExp) dynamicFExp(res);
     918            access = new FAccessString(name + i);
     919        }
     920        return (FTempAccessExp) dynamicFExp(new FTempAccessExp(access));
    921921    }
    922922
    923923    public FTempAccessExp FExp.tempExp(String name, FArraySubscripts fas) {
    924         FTempAccessExp res;
     924        FAccess access;
    925925        if (inFunction()) {
    926             res = new FTempAccessExp(new FAccessFull(name, fas));
     926            if (fas == null) {
     927                access = new FAccessFull(name);
     928            } else {
     929                access = new FAccessFull(name, fas);
     930            }
    927931        } else {
    928932            if (fas == null) {
    929                 res = new FTempAccessExp(new FAccessString(name));
     933                access = new FAccessString(name);
    930934            } else {
    931                 res = new FTempAccessExp(new FAccessString(name + fas));
    932             }
    933         }
    934         return (FTempAccessExp) dynamicFExp(res);
     935                access = new FAccessString(name + fas);
     936            }
     937        }
     938        return (FTempAccessExp) dynamicFExp(new FTempAccessExp(access));
    935939    }
    936940
  • branches/stable/Compiler/ModelicaMiddleEnd/src/jastadd/scalarization/ScalarizeFunctions.jrag

    r12716 r13892  
    497497                List<FSubscript> subs = new List<FSubscript>();
    498498                subs.add(new FIntegerSubscript(i+1));
    499                 subs.addAll(names.createFArraySubscripts().copyAsFArrayExpSubscripts().getFSubscriptListNoTransform());
     499                if (names.hasNames()) {
     500                    subs.addAll(names.createFArraySubscripts().copyAsFArrayExpSubscripts().getFSubscriptListNoTransform());
     501                }
    500502                left = tempExp(new FArrayExpSubscripts(subs));
    501503                right.createArrayTemporaries(s);
     
    916918   
    917919    public void FAccessExp.addArrayUsesToIndexMap(Scalarizer s, FExp[] names) {
    918         if (!hasFArraySubscripts() && isArray())
     920        if (!hasFArraySubscripts() && myFV().isArray()) {
    919921            indexNames = names;
     922        }
    920923        super.addArrayUsesToIndexMap(s, names);
    921924    }
     
    12121215         * Creates a new FArraySubscripts with uses of the <code>d1</code> to <code>d2</code> names
    12131216         * in the top layer as subscripts. When out of names, adds 1s.
     1217         *
     1218         * Returns null if d1 == d2.
    12141219         */
    12151220        public FArrayExpSubscripts createFArraySubscripts(int d1, int d2) {
    1216             if (d1 < 0)
    1217                 throw new UnsupportedOperationException();
     1221            if (d1 == d2) {
     1222                return null;
     1223            }
    12181224            FArrayExpSubscripts fas = new FArrayExpSubscripts();
    12191225            for (int i = d1; i < d2; ++i) {
    1220                 if (i < topLayer().length)
     1226                if (i < topLayer().length) {
    12211227                    fas.addFSubscript(new FExpSubscript(new FTempAccessExp(new FAccessFull(topLayer()[i]))));
    1222                 else
     1228                } else {
    12231229                    fas.addFSubscript(new FIntegerSubscript(1));
     1230                }
    12241231            }
    12251232            return fas;
     
    12291236         * Creates a new FArraySubscripts with uses of the <code>d</code>
    12301237         * first names in the top layer as subscripts. When out of names, adds 1s.
     1238         * Returns null if d == 0.
    12311239         */
    12321240        public FArrayExpSubscripts createFArraySubscripts(int d) {
     
    12361244        /**
    12371245         * Creates a new FArraySubscripts with uses of all the names in the top layer.
     1246         * Returns null if no names available.
    12381247         */
    12391248        public FArrayExpSubscripts createFArraySubscripts() {
  • branches/stable/Compiler/ModelicaMiddleEnd/test/modelica/VariabilityPropagationPartialTests.mo

    r12716 r13892  
    10131013    end PartiallyKnownDiscrete1;
    10141014
     1015    model PartiallyKnownTempAssign1
     1016        record R
     1017            Real x1;
     1018            Real x2;
     1019        end R;
     1020        function f
     1021            input Real x1;
     1022            input Real x2;
     1023            output R r = R(x1,x2);
     1024        algorithm
     1025            annotation(Inline=false);
     1026        end f;
     1027       
     1028       
     1029        R r = if time > 1 then f(1,time) else f(time,1);
     1030
     1031    annotation(__JModelica(UnitTesting(tests={
     1032        TransformCanonicalTestCase(
     1033            name="PartiallyKnownTempAssign1",
     1034            description="Partial evaluation of if equation assigning temporaries",
     1035            flatModel="
     1036fclass VariabilityPropagationPartialTests.PartiallyKnownTempAssign1
     1037 Real r.x1;
     1038 Real r.x2;
     1039 Real temp_1.x1;
     1040 Real temp_1.x2;
     1041 Real temp_2.x1;
     1042 Real temp_2.x2;
     1043equation
     1044 if time > 1 then
     1045  (VariabilityPropagationPartialTests.PartiallyKnownTempAssign1.R(temp_1.x1, temp_1.x2)) = VariabilityPropagationPartialTests.PartiallyKnownTempAssign1.f(1, time);
     1046 else
     1047  temp_1.x1 = 0.0;
     1048  temp_1.x2 = 0.0;
     1049 end if;
     1050 if not time > 1 then
     1051  (VariabilityPropagationPartialTests.PartiallyKnownTempAssign1.R(temp_2.x1, temp_2.x2)) = VariabilityPropagationPartialTests.PartiallyKnownTempAssign1.f(time, 1);
     1052 else
     1053  temp_2.x1 = 0.0;
     1054  temp_2.x2 = 0.0;
     1055 end if;
     1056 r.x1 = if time > 1 then temp_1.x1 else temp_2.x1;
     1057 r.x2 = if time > 1 then temp_1.x2 else temp_2.x2;
     1058
     1059public
     1060 function VariabilityPropagationPartialTests.PartiallyKnownTempAssign1.f
     1061  input Real x1;
     1062  input Real x2;
     1063  output VariabilityPropagationPartialTests.PartiallyKnownTempAssign1.R r;
     1064 algorithm
     1065  r.x1 := x1;
     1066  r.x2 := x2;
     1067  return;
     1068 annotation(Inline = false);
     1069 end VariabilityPropagationPartialTests.PartiallyKnownTempAssign1.f;
     1070
     1071 record VariabilityPropagationPartialTests.PartiallyKnownTempAssign1.R
     1072  Real x1;
     1073  Real x2;
     1074 end VariabilityPropagationPartialTests.PartiallyKnownTempAssign1.R;
     1075
     1076end VariabilityPropagationPartialTests.PartiallyKnownTempAssign1;
     1077")})));
     1078    end PartiallyKnownTempAssign1;
     1079
    10151080
    10161081end VariabilityPropagationPartialTests;
Note: See TracChangeset for help on using the changeset viewer.