| /* |
| Copyright 2019 Alain Dargelas |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| /* |
| * File: Builtin.cpp |
| * Author: alain |
| * |
| * Created on May 30, 2019, 6:36 PM |
| */ |
| #include "SourceCompile/VObjectTypes.h" |
| #include "Design/VObject.h" |
| #include "Library/Library.h" |
| #include "Design/Signal.h" |
| #include "Design/FileContent.h" |
| #include "Design/ClockingBlock.h" |
| #include "SourceCompile/SymbolTable.h" |
| #include "ErrorReporting/Error.h" |
| #include "ErrorReporting/Location.h" |
| #include "ErrorReporting/Error.h" |
| #include "CommandLine/CommandLineParser.h" |
| #include "ErrorReporting/ErrorDefinition.h" |
| #include "ErrorReporting/ErrorContainer.h" |
| #include "SourceCompile/CompilationUnit.h" |
| #include "SourceCompile/PreprocessFile.h" |
| #include "SourceCompile/CompileSourceFile.h" |
| #include "SourceCompile/ParseFile.h" |
| #include "SourceCompile/Compiler.h" |
| #include "DesignCompile/CompileDesign.h" |
| #include "Testbench/ClassDefinition.h" |
| #include "DesignCompile/CompileClass.h" |
| #include "DesignCompile/Builtin.h" |
| using namespace SURELOG; |
| |
| Builtin::~Builtin() {} |
| |
| VObjectType convert(std::string type) { |
| VObjectType result = VObjectType::slNoType; |
| if (type == "int") |
| result = VObjectType::slIntegerAtomType_Int; |
| else if (type == "generic") |
| result = VObjectType::slGenericElementType; |
| return result; |
| } |
| |
| void Builtin::addBuiltins() { |
| std::vector<std::vector<std::string>> functionDef = { |
| {"builtin", "array", "generic", "find"}, |
| {"builtin", "array", "int", "find_index"}, |
| {"builtin", "array", "int", "find_first"}, |
| {"builtin", "array", "int", "find_first_index"}, |
| {"builtin", "array", "int", "find_last"}, |
| {"builtin", "array", "int", "find_last_index"}, |
| {"builtin", "array", "int", "min"}, |
| {"builtin", "array", "int", "max"}, |
| {"builtin", "array", "int", "unique"}, |
| {"builtin", "array", "int", "unique_index"}, |
| {"builtin", "array", "void", "reverse"}, |
| {"builtin", "array", "void", "sort"}, |
| {"builtin", "array", "void", "rsort"}, |
| {"builtin", "array", "void", "shuffle"}, |
| {"builtin", "array", "void", "sum"}, |
| {"builtin", "array", "void", "product"}, |
| {"builtin", "array", "void", "and"}, |
| {"builtin", "array", "void", "or"}, |
| {"builtin", "array", "void", "xor"}, |
| {"builtin", "array", "void", "delete"}, |
| |
| {"builtin", "queue", "int", "size"}, |
| {"builtin", "queue", "void", "insert", "int", "generic"}, |
| {"builtin", "queue", "void", "delete", "int"}, |
| {"builtin", "queue", "generic", "pop_front"}, |
| {"builtin", "queue", "generic", "pop_back"}, |
| {"builtin", "queue", "void", "push_front", "generic"}, |
| {"builtin", "queue", "void", "push_back", "generic"}, |
| |
| {"builtin", "string", "int", "len"}, |
| {"builtin", "string", "void", "putc", "int", "int"}, |
| {"builtin", "string", "int", "getc", "int"}, |
| {"builtin", "string", "string", "toupper"}, |
| {"builtin", "string", "string", "tolower"}, |
| {"builtin", "string", "int", "compare", "string"}, |
| {"builtin", "string", "int", "icompare", "string"}, |
| {"builtin", "string", "string", "substr", "int", "int"}, |
| {"builtin", "string", "int", "atoi"}, |
| {"builtin", "string", "real", "atoreal"}, |
| {"builtin", "string", "void", "itoa", "int"}, |
| {"builtin", "string", "void", "hextoa", "int"}, |
| {"builtin", "string", "void", "bintoa", "int"}, |
| {"builtin", "string", "void", "realtoa", "real"}, |
| |
| {"builtin", "system", "void", "display", "generic"}, |
| {"builtin", "system", "void", "write", "generic"}, |
| {"builtin", "system", "void", "strobe", "generic"}, |
| {"builtin", "system", "void", "monitor", "generic"}, |
| {"builtin", "system", "void", "monitoron", "generic"}, |
| {"builtin", "system", "void", "monitoroff", "generic"}, |
| {"builtin", "system", "void", "displayb", "generic"}, |
| {"builtin", "system", "void", "writeb", "generic"}, |
| {"builtin", "system", "void", "strobeb", "generic"}, |
| {"builtin", "system", "void", "monitorb", "generic"}, |
| {"builtin", "system", "void", "displayo", "generic"}, |
| {"builtin", "system", "void", "writeo", "generic"}, |
| {"builtin", "system", "void", "strobeo", "generic"}, |
| {"builtin", "system", "void", "monitoro", "generic"}, |
| {"builtin", "system", "void", "displayh", "generic"}, |
| {"builtin", "system", "void", "writeh", "generic"}, |
| {"builtin", "system", "void", "strobeh", "generic"}, |
| {"builtin", "system", "void", "monitorh", "generic"}, |
| {"builtin", "system", "void", "fopen", "generic"}, |
| {"builtin", "system", "void", "fclose", "generic"}, |
| {"builtin", "system", "void", "frewind", "generic"}, |
| {"builtin", "system", "void", "fflush", "generic"}, |
| {"builtin", "system", "void", "fseek", "generic"}, |
| {"builtin", "system", "void", "ftell", "generic"}, |
| {"builtin", "system", "void", "fdisplay", "generic"}, |
| {"builtin", "system", "void", "fwrite", "generic"}, |
| {"builtin", "system", "void", "swrite", "generic"}, |
| {"builtin", "system", "void", "fstrobe", "generic"}, |
| {"builtin", "system", "void", "fmonitor", "generic"}, |
| {"builtin", "system", "void", "fread", "generic"}, |
| {"builtin", "system", "void", "fscanf", "generic"}, |
| {"builtin", "system", "void", "fdisplayb", "generic"}, |
| {"builtin", "system", "void", "fwriteb", "generic"}, |
| {"builtin", "system", "void", "swriteb", "generic"}, |
| {"builtin", "system", "void", "fstrobeb", "generic"}, |
| {"builtin", "system", "void", "fmonitorb", "generic"}, |
| {"builtin", "system", "void", "fdisplayo", "generic"}, |
| {"builtin", "system", "void", "fwriteo", "generic"}, |
| {"builtin", "system", "void", "swriteo", "generic"}, |
| {"builtin", "system", "void", "fstrobeo", "generic"}, |
| {"builtin", "system", "void", "fmonitoro", "generic"}, |
| {"builtin", "system", "void", "fdisplayh", "generic"}, |
| {"builtin", "system", "void", "fwriteh", "generic"}, |
| {"builtin", "system", "void", "swriteh", "generic"}, |
| {"builtin", "system", "void", "fstrobeh", "generic"}, |
| {"builtin", "system", "void", "fmonitorh", "generic"}, |
| {"builtin", "system", "void", "sscanf", "generic"}, |
| {"builtin", "system", "void", "sdf_annotate", "generic"}, |
| {"builtin", "system", "void", "sformat", "generic"}, |
| {"builtin", "system", "void", "cast", "generic"}, |
| {"builtin", "system", "void", "assertkill", "generic"}, |
| {"builtin", "system", "void", "assertoff", "generic"}, |
| {"builtin", "system", "void", "asserton", "generic"}, |
| {"builtin", "system", "void", "bits", "generic"}, |
| {"builtin", "system", "void", "bitstoshortreal", "generic"}, |
| {"builtin", "system", "void", "countones", "generic"}, |
| {"builtin", "system", "void", "coverage_control", "generic"}, |
| {"builtin", "system", "void", "coverage_merge", "generic"}, |
| {"builtin", "system", "void", "coverage_save", "generic"}, |
| {"builtin", "system", "void", "dimensions", "generic"}, |
| {"builtin", "system", "void", "error", "generic"}, |
| {"builtin", "system", "void", "exit", "generic"}, |
| {"builtin", "system", "void", "fatal", "generic"}, |
| {"builtin", "system", "void", "fell", "generic"}, |
| {"builtin", "system", "void", "get_coverage", "generic"}, |
| {"builtin", "system", "void", "high", "generic"}, |
| {"builtin", "system", "void", "increment", "generic"}, |
| {"builtin", "system", "void", "info", "generic"}, |
| {"builtin", "system", "void", "isunbounded", "generic"}, |
| {"builtin", "system", "void", "isunknown", "generic"}, |
| {"builtin", "system", "void", "left", "generic"}, |
| {"builtin", "system", "void", "load_coverage_db", "generic"}, |
| {"builtin", "system", "void", "low", "generic"}, |
| {"builtin", "system", "void", "onehot", "generic"}, |
| {"builtin", "system", "void", "past", "generic"}, |
| {"builtin", "system", "void", "readmemb", "generic"}, |
| {"builtin", "system", "void", "readmemh", "generic"}, |
| {"builtin", "system", "void", "right", "generic"}, |
| {"builtin", "system", "void", "root", "generic"}, |
| {"builtin", "system", "void", "rose", "generic"}, |
| {"builtin", "system", "void", "sampled", "generic"}, |
| {"builtin", "system", "void", "set_coverage_db_name", "generic"}, |
| {"builtin", "system", "void", "shortrealtobits", "generic"}, |
| {"builtin", "system", "void", "size", "generic"}, |
| {"builtin", "system", "void", "stable", "generic"}, |
| {"builtin", "system", "void", "typename", "generic"}, |
| {"builtin", "system", "void", "typeof", "generic"}, |
| {"builtin", "system", "void", "unit", "generic"}, |
| {"builtin", "system", "void", "urandom", "generic"}, |
| {"builtin", "system", "void", "urandom_range", "generic"}, |
| {"builtin", "system", "void", "warning", "generic"}, |
| {"builtin", "system", "void", "writememb", "generic"}, |
| {"builtin", "system", "void", "writememh", "generic"}, |
| {"builtin", "system", "void", "value$plusargs", "generic"}, |
| |
| }; |
| for (auto function : functionDef) { |
| std::string packageName = function[0]; |
| std::string className = function[1]; |
| std::string returnTypeName = function[2]; |
| std::string functionName = function[3]; |
| Package* package = m_design->getPackage(packageName); |
| if (package == NULL) { |
| package = new Package(packageName, NULL, NULL, 0); |
| m_design->addPackageDefinition(packageName, package); |
| } |
| std::string fullClassName = packageName + "::" + className; |
| ClassDefinition* classDef = m_design->getClassDefinition(fullClassName); |
| if (classDef == NULL) { |
| classDef = |
| new ClassDefinition(fullClassName, NULL, package, NULL, 0, NULL); |
| m_design->addClassDefinition(fullClassName, classDef); |
| package->addClassDefinition(fullClassName, classDef); |
| } |
| |
| DataType* dtype = |
| new DataType(NULL, 0, returnTypeName, convert(returnTypeName)); |
| FunctionMethod* method = |
| new FunctionMethod(classDef, NULL, 0, functionName, dtype, false, false, |
| false, false, false, false); |
| classDef->insertFunction(method); |
| } |
| } |