Changeset 13533


Ignore:
Timestamp:
Sep 18, 2019 7:56:32 PM (3 months ago)
Author:
Christian Andersson
Message:

Updated the evaluator after review comments. Related to ticket:5837

Location:
branches/dev-cw-evaluator/Compiler
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/dev-cw-evaluator/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenExternalCeval.jrag

    r13449 r13533  
    290290    }
    291291   
    292     syn String FExternalStmt.convertFtypeToExternalString(FType arg, boolean useSeparator) {
    293         String input = "";
    294         if (arg.isReal()) {
    295             input = input.concat("d");
    296         } else if (arg.isInteger() || arg.isEnum() || arg.isBoolean()) {
    297             input = input.concat("i");
    298         } else if (arg.isString()) {
    299             input = input.concat("s");
    300         } else if (arg.isRecord()) {
    301             input = input.concat("R[");
    302             for (FRecordComponentType rType: ((FRecordType)arg).getComponents()) {
    303                 input = input.concat(convertFtypeToExternalString(rType.getFType(), true));
    304             }
    305             input = input.concat("]");
    306         }
    307         if (arg.isArray()) {
    308             input = input.concat("v");
    309         }
    310         if (useSeparator) {
    311             input = input.concat(",");
    312         }
    313         return input;
     292    syn String FType.cMappedTypeString() = "e";
     293    eq FArrayType.cMappedTypeString() = getFPrimitiveType().cMappedTypeString() + "v";
     294    eq FIntegerType.cMappedTypeString() = "i";
     295    eq FEnumType.cMappedTypeString() = "i";
     296    eq FBooleanType.cMappedTypeString() = "i";
     297    eq FRealType.cMappedTypeString() = "d";
     298    eq FStringType.cMappedTypeString() = "s";
     299    eq FRecordType.cMappedTypeString() {
     300        String o = "R[";
     301        for (FRecordComponentType rType: getComponents()) {
     302                o = o.concat(rType.getFType().cMappedTypeString());
     303                o = o.concat(",");
     304        }
     305        return o.concat("]");
    314306    }
    315307   
    316308    syn String FExternalStmt.functionArgsSerialized(boolean returnVar) {
    317309        boolean skippedReturnVar = false;
     310        final boolean hasReturnVar = hasReturnVar();
     311       
    318312        String input = "";
    319313        for (ExternalArgument var : functionArgsToSerialize()) {
    320314            if (returnVar) {
    321                 if (hasReturnVar()) {
    322                     return convertFtypeToExternalString(var.type(), false);
     315                if (hasReturnVar) {
     316                    return var.type().cMappedTypeString();
    323317                } else {
    324318                    return "void";
    325319                }
    326320            }
    327             if (hasReturnVar() && skippedReturnVar != true) {
     321            if (hasReturnVar && !skippedReturnVar) {
    328322                skippedReturnVar = true;
    329323                continue;
     
    332326               input = input.concat("*");
    333327            }
    334             input = input.concat(convertFtypeToExternalString(var.type(), true));
     328            input += var.type().cMappedTypeString() + ",";
    335329        }
    336330        return input;
  • branches/dev-cw-evaluator/Compiler/ModelicaCompiler/module.options

    r13448 r13533  
    458458
    459459********************************************************************************
    460 BOOLEAN enable_external_evaluator compiler experimental true
     460BOOLEAN external_constant_dynamic_evaluator compiler experimental true
    461461
    462462"If enabled, the external function will be evaluated using a pre-compiled
  • branches/dev-cw-evaluator/Compiler/ModelicaCompiler/src/java/org/jmodelica/util/ccompiler/CCompilerDelegator.java

    r13274 r13533  
    351351        };
    352352    }
     353
     354    public abstract Set<String> expandCompilerSpecificLibraryPaths(ModelicaLogger log, AbstractOptionRegistry options,
     355            Set<String> extLibDirs, String platform);
    353356}
    354357
  • branches/dev-cw-evaluator/Compiler/ModelicaCompiler/src/java/org/jmodelica/util/ccompiler/GccCompilerDelegator.java

    r13300 r13533  
    2626import java.util.Set;
    2727
     28import org.jmodelica.common.options.AbstractOptionRegistry;
    2829import org.jmodelica.util.EnvironmentUtils;
    2930import org.jmodelica.util.exceptions.CcodeCompilationException;
     
    106107            vars.put("AR", new File(mingw_bin, "ar").getPath());
    107108        }
     109    }
     110   
     111    @Override
     112    public Set<String> expandCompilerSpecificLibraryPaths(ModelicaLogger log, AbstractOptionRegistry options, Set<String> extLibDirs, String platform) {
     113        Set<String> expandedLibDirs = expandLibraries(extLibDirs, platform, "gcc" + compilerVersionNumber());
     114        return expandedLibDirs;
    108115    }
    109116   
  • branches/dev-cw-evaluator/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/common/evaluation/ExternalProcessCacheImpl.java

    r13480 r13533  
    88import java.util.ArrayList;
    99import java.util.HashMap;
     10import java.util.HashSet;
    1011import java.util.LinkedHashSet;
    1112import java.util.Map;
     13import java.util.Set;
    1214
    1315import org.jmodelica.common.evaluation.ExternalProcessMultiCache.Compiler;
     
    4547    }
    4648   
     49    private String getPlatform() {
     50        return CCompilerDelegator.reduceBits(EnvironmentUtils.getJavaPlatform(),
     51                mc.getCCompiler().getTargetPlatforms());
     52    }
     53   
    4754    private String getSharedLibrary(External<K> ext) {
    48         /* Messy messy... Please fix me...*/
    4955        String sharedLib = "";
    50         final String extName = ext.getName();
    51         String platform = CCompilerDelegator.reduceBits(EnvironmentUtils.getJavaPlatform(),
    52                 mc.getCCompiler().getTargetPlatforms());
    53         File f = new File(ext.libraryDirectory(), platform);
    54         String libLoc = f.isDirectory() ? f.getPath() : ext.libraryDirectory();
    55         if (libLoc != null) {
    56             File dir = new File(libLoc);
    57             File[] matches = dir.listFiles(new FilenameFilter()
    58             {
    59               public boolean accept(File dir, String name)
    60               {
    61                  return name.contains(extName) && name.endsWith(SystemUtil.sharedLibraryExtension());
    62               }
    63             });
    64             for(File file : matches) {
    65                 sharedLib = file.toString();
     56        String extLibrary = "";
     57       
     58        if (ext.library().length == 1) {
     59            extLibrary = ext.library()[0];
     60        } else {
     61            return sharedLib;
     62        }
     63       
     64        HashSet<String> externalLibraryDirectories = new HashSet<String>();
     65        externalLibraryDirectories.add(ext.libraryDirectory());
     66        Set<String> expandedLibDirs = mc.getCCompiler().expandCompilerSpecificLibraryPaths(mc.log(), ext.myOptions(),
     67                                                   externalLibraryDirectories, getPlatform());
     68       
     69        for (String dir : expandedLibDirs) {
     70            File testlib1 = new File(dir, extLibrary + SystemUtil.sharedLibraryExtension());
     71            File testlib2 = new File(dir, "lib" + extLibrary + SystemUtil.sharedLibraryExtension());
     72           
     73            if (testlib1.exists() && !testlib1.isDirectory()) {
     74                sharedLib = testlib1.toString();
    6675                break;
    6776            }
    68             if (sharedLib.equals("")) {
    69                 for (String lib : ext.library()) {
    70                     File tmp = new File(libLoc, lib.concat(SystemUtil.sharedLibraryExtension()));
    71                     if (tmp.exists() && !tmp.isDirectory()) {
    72                         sharedLib = tmp.toString();
    73                     } else {
    74                         File tmpWithLib = new File(libLoc, "lib"+lib.concat(SystemUtil.sharedLibraryExtension()));
    75                         if (tmpWithLib.exists() && !tmpWithLib.isDirectory()) {
    76                             sharedLib = tmpWithLib.toString();
    77                         }
    78                     }
    79                 }
    80             }
    81         }
     77            if (testlib2.exists() && !testlib2.isDirectory()) {
     78                sharedLib = testlib2.toString();
     79                break;
     80            }
     81        }
     82       
    8283        return sharedLib;
    8384    }
     
    9596    }
    9697   
    97     private ArrayList<String> builtinExternalFunctions = new ArrayList<String>() {{
     98    private static ArrayList<String> builtinExternalFunctions = new ArrayList<String>() {{
    9899        add("ModelicaStrings_substring");
    99100        add("ModelicaStrings_length");
     
    101102    }};
    102103   
    103     private ArrayList<String> supportedSignatures = new ArrayList<String>() {{
     104    private static ArrayList<String> supportedSignatures = new ArrayList<String>() {{
    104105        add("d+d,d,");
    105106        add("d+i,");
     
    113114   
    114115    public boolean canUseEvaluator(E ext, ArrayList<String> arguments) {
    115         if (!(ext.myOptions().getBooleanOption("enable_external_evaluator"))) {
     116        if (!(ext.myOptions().getBooleanOption("external_constant_dynamic_evaluator"))) {
    116117            return false;
    117118        }
     
    163164                if (canUseEvaluator(ext, arguments)) {
    164165                    String jmHome = System.getenv("JMODELICA_HOME");
    165                     String platform = CCompilerDelegator.reduceBits(EnvironmentUtils.getJavaPlatform(),mc.getCCompiler().getTargetPlatforms());
    166                     String bits = platform.contains("64") && SystemUtil.isWindows() ? "64" : "";
     166                    String bits = getPlatform().contains("64") && SystemUtil.isWindows() ? "64" : "";
    167167                    executable = jmHome + File.separator + "bin" + bits + File.separator + "jmi_evaluator" + SystemUtil.executableExtension();
    168168                   
     
    349349            }
    350350        }
    351        
    352         public ProcessBuilder _createProcessBuilder(External<K> ext) {
     351
     352        private ProcessBuilder createProcessBuilder(External<K> ext) {
    353353            ProcessBuilder pb;
    354354            if (arguments == null) {
     
    357357                pb = new ProcessBuilder(arguments);
    358358            }
    359             return pb;
    360         }
    361 
    362         private ProcessBuilder createProcessBuilder(External<K> ext) {
    363             ProcessBuilder pb = _createProcessBuilder(ext);
    364359            Map<String, String> env = pb.environment();
    365360            if (env.keySet().contains("Path")) {
Note: See TracChangeset for help on using the changeset viewer.