blob: af15f1bf6e76ad1083860f58c1ce9959816ad57b [file] [log] [blame]
/*
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);
}
}