blob: 22287479607716977c311fe5dbb4eb10f665856e [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: SLAPI.cpp
* Author: alain
*
* Created on May 13, 2017, 4:42 PM
*/
#include "Python.h"
#include <string>
#include <vector>
#include "antlr4-runtime.h"
using namespace antlr4;
#include "ErrorReporting/Waiver.h"
#include "ErrorReporting/ErrorDefinition.h"
#include "SourceCompile/SymbolTable.h"
#include "ErrorReporting/ErrorContainer.h"
#include "Utils/StringUtils.h"
#include "CommandLine/CommandLineParser.h"
#include "SourceCompile/CompilationUnit.h"
#include "SourceCompile/PreprocessFile.h"
#include "SourceCompile/CompileSourceFile.h"
#include "SourceCompile/Compiler.h"
#include "SourceCompile/ParseFile.h"
#include "SourceCompile/PythonListen.h"
#include "Design/FileContent.h"
#include "Testbench/ClassDefinition.h"
#include <cstdlib>
#include <iostream>
#include "antlr4-runtime.h"
using namespace std;
using namespace antlr4;
using namespace SURELOG;
#include "ParserRuleContext.h"
#include "parser/SV3_1aLexer.h"
#include "parser/SV3_1aParser.h"
#include "parser/SV3_1aParserBaseListener.h"
#include "API/SV3_1aPythonListener.h"
#include "Utils/ParseUtils.h"
#include "Utils/FileUtils.h"
#include "API/PythonAPI.h"
#include "API/SLAPI.h"
void SURELOG::SLsetWaiver(const char* messageId, const char* fileName,
unsigned int line, const char* objectName) {
if (fileName == 0 && line == 0 && objectName == 0) {
Waiver::setWaiver(messageId, "", 0, "");
} else if (line == 0 && objectName == 0) {
Waiver::setWaiver(messageId, "", 0, fileName);
} else if (objectName == 0) {
Waiver::setWaiver(messageId, fileName, line, "");
} else {
Waiver::setWaiver(messageId, fileName, line, objectName);
}
}
void SURELOG::SLregisterNewErrorType(const char* messageId, const char* text,
const char* secondLine) {
//[WARNI:PP0103]
std::string errorId = messageId;
errorId = StringUtils::rtrim(errorId, ']');
errorId = StringUtils::ltrim(errorId, '[');
ErrorDefinition::ErrorType type = ErrorDefinition::getErrorType(messageId);
ErrorDefinition::ErrorSeverity severity =
ErrorDefinition::getErrorSeverity(errorId.substr(0, 5));
ErrorDefinition::ErrorCategory category =
ErrorDefinition::getCategory(errorId.substr(6, 2));
ErrorDefinition::rec(type, severity, category, text, secondLine);
}
void SURELOG::SLoverrideSeverity(const char* messageId, const char* severity) {
ErrorDefinition::setSeverity(ErrorDefinition::getErrorType(messageId),
ErrorDefinition::getErrorSeverity(severity));
}
void SURELOG::SLaddError(ErrorContainer* errors, const char* messageId,
const char* fileName, unsigned int line,
unsigned int col, const char* objectName) {
if (errors == NULL) return;
SymbolTable* symbolTable = errors->getSymbolTable();
SymbolId fileId = 0;
if (fileName && (strcmp(fileName, "")))
fileId = symbolTable->registerSymbol(fileName);
SymbolId objectId = 0;
if (objectName && (strcmp(objectName, "")))
objectId = symbolTable->registerSymbol(objectName);
Location loc(fileId, line, col, objectId);
ErrorDefinition::ErrorType type = ErrorDefinition::getErrorType(messageId);
Error err(type, loc);
errors->addError(err, false, false);
}
void SURELOG::SLaddMLError(ErrorContainer* errors, const char* messageId,
const char* fileName1, unsigned int line1,
unsigned int col1, const char* objectName1,
const char* fileName2, unsigned int line2,
unsigned int col2, const char* objectName2) {
if (errors == NULL) return;
SymbolTable* symbolTable = errors->getSymbolTable();
SymbolId fileId1 = 0;
if (fileName1 && (strcmp(fileName1, "")))
fileId1 = symbolTable->registerSymbol(fileName1);
SymbolId objectId1 = 0;
if (objectName1 && (strcmp(objectName1, "")))
objectId1 = symbolTable->registerSymbol(objectName1);
Location loc1(fileId1, line1, col1, objectId1);
SymbolId fileId2 = 0;
if (fileName2 && (strcmp(fileName2, "")))
fileId2 = symbolTable->registerSymbol(fileName2);
SymbolId objectId2 = 0;
if (objectName2 && (strcmp(objectName2, "")))
objectId2 = symbolTable->registerSymbol(objectName2);
Location loc2(fileId2, line2, col2, objectId2);
ErrorDefinition::ErrorType type = ErrorDefinition::getErrorType(messageId);
Error err(type, loc2, loc2);
errors->addError(err, false, false);
}
void SURELOG::SLaddErrorContext(SV3_1aPythonListener* prog,
antlr4::ParserRuleContext* context,
const char* messageId, const char* objectName,
bool printColumn) {
SV3_1aPythonListener* listener = (SV3_1aPythonListener*)prog;
antlr4::ParserRuleContext* ctx = (antlr4::ParserRuleContext*)context;
ErrorContainer* errors =
listener->getPythonListen()->getCompileSourceFile()->getErrorContainer();
std::pair<int, int> lineCol =
ParseUtils::getLineColumn(listener->getTokenStream(), ctx);
ErrorDefinition::ErrorType type = ErrorDefinition::getErrorType(messageId);
Location loc(
listener->getPythonListen()->getParseFile()->getFileId(lineCol.first),
listener->getPythonListen()->getParseFile()->getLineNb(lineCol.first),
printColumn ? lineCol.second : 0,
listener->getPythonListen()
->getCompileSourceFile()
->getSymbolTable()
->registerSymbol(objectName));
Error err(type, loc);
errors->addError(err, false, false);
}
void SURELOG::SLaddMLErrorContext(SV3_1aPythonListener* prog,
antlr4::ParserRuleContext* context1,
antlr4::ParserRuleContext* context2,
const char* messageId,
const char* objectName1,
const char* objectName2, bool printColumn) {
SV3_1aPythonListener* listener = (SV3_1aPythonListener*)prog;
antlr4::ParserRuleContext* ctx1 = (antlr4::ParserRuleContext*)context1;
antlr4::ParserRuleContext* ctx2 = (antlr4::ParserRuleContext*)context2;
ErrorContainer* errors =
listener->getPythonListen()->getCompileSourceFile()->getErrorContainer();
std::pair<int, int> lineCol1 =
ParseUtils::getLineColumn(listener->getTokenStream(), ctx1);
std::pair<int, int> lineCol2 =
ParseUtils::getLineColumn(listener->getTokenStream(), ctx2);
ErrorDefinition::ErrorType type = ErrorDefinition::getErrorType(messageId);
Location loc1(
listener->getPythonListen()->getParseFile()->getFileId(lineCol1.first),
listener->getPythonListen()->getParseFile()->getLineNb(lineCol1.first),
printColumn ? lineCol1.second : 0,
listener->getPythonListen()
->getCompileSourceFile()
->getSymbolTable()
->registerSymbol(objectName1));
Location loc2(
listener->getPythonListen()->getParseFile()->getFileId(lineCol2.first),
listener->getPythonListen()->getParseFile()->getLineNb(lineCol2.first),
printColumn ? lineCol2.second : 0,
listener->getPythonListen()
->getCompileSourceFile()
->getSymbolTable()
->registerSymbol(objectName2));
Error err(type, loc1, loc2);
errors->addError(err, false, false);
}
std::string SURELOG::SLgetFile(SV3_1aPythonListener* prog,
antlr4::ParserRuleContext* context) {
SV3_1aPythonListener* listener = (SV3_1aPythonListener*)prog;
std::string file =
listener->getPythonListen()->getParseFile()->getFileName(0);
return file;
}
int SURELOG::SLgetLine(SV3_1aPythonListener* prog, antlr4::ParserRuleContext* context) {
SV3_1aPythonListener* listener = (SV3_1aPythonListener*)prog;
antlr4::ParserRuleContext* ctx = (antlr4::ParserRuleContext*)context;
std::pair<int, int> lineCol =
ParseUtils::getLineColumn(listener->getTokenStream(), ctx);
return lineCol.first;
}
int SURELOG::SLgetColumn(SV3_1aPythonListener* prog,
antlr4::ParserRuleContext* context) {
SV3_1aPythonListener* listener = (SV3_1aPythonListener*)prog;
antlr4::ParserRuleContext* ctx = (antlr4::ParserRuleContext*)context;
std::pair<int, int> lineCol =
ParseUtils::getLineColumn(listener->getTokenStream(), ctx);
return lineCol.second;
}
std::string SURELOG::SLgetText(SV3_1aPythonListener* /*prog*/,
antlr4::ParserRuleContext* context) {
antlr4::ParserRuleContext* ctx = (antlr4::ParserRuleContext*)context;
std::vector<Token*> tokens = ParseUtils::getFlatTokenList(ctx);
std::string text;
for (auto token : tokens) {
text += token->getText() + " ";
}
return text;
}
std::vector<std::string> SURELOG::SLgetTokens(SV3_1aPythonListener* prog,
antlr4::ParserRuleContext* context) {
antlr4::ParserRuleContext* ctx = (antlr4::ParserRuleContext*)context;
std::vector<Token*> tokens = ParseUtils::getFlatTokenList(ctx);
std::vector<std::string> body_tokens;
for (auto token : tokens) {
body_tokens.push_back(token->getText());
}
return body_tokens;
}
antlr4::ParserRuleContext* SURELOG::SLgetParentContext(SV3_1aPythonListener* prog,
antlr4::ParserRuleContext* context) {
antlr4::ParserRuleContext* ctx = (antlr4::ParserRuleContext*)context;
return (antlr4::ParserRuleContext*)ctx->parent;
}
std::vector<antlr4::ParserRuleContext*> SURELOG::SLgetChildrenContext(
SV3_1aPythonListener* prog, antlr4::ParserRuleContext* context) {
antlr4::ParserRuleContext* ctx = (antlr4::ParserRuleContext*)context;
std::vector<antlr4::ParserRuleContext*> children;
for (unsigned int i = 0; i < ctx->children.size(); i++) {
// Get the i-th child node of `parent`.
tree::ParseTree* child = ctx->children[i];
tree::TerminalNode* node = dynamic_cast<tree::TerminalNode*>(child);
if (node) {
// Terminal node
} else {
// Rule
children.push_back((antlr4::ParserRuleContext*)child);
}
}
return children;
}
NodeId SURELOG::SLgetRootNode(FileContent* fC) {
if (!fC) return 0;
return fC->getRootNode();
}
std::string SURELOG::SLgetFile(FileContent* fC, NodeId id) {
if (!fC) return "";
return fC->getSymbolTable()->getSymbol(fC->getFileId(id));
}
unsigned int SURELOG::SLgetType(FileContent* fC, NodeId id) {
if (!fC) return 0;
return fC->Type(id);
}
NodeId SURELOG::SLgetChild(FileContent* fC, NodeId index) {
if (!fC) return 0;
return fC->Child(index);
}
NodeId SURELOG::SLgetSibling(FileContent* fC, NodeId index) {
if (!fC) return 0;
return fC->Sibling(index);
}
NodeId SURELOG::SLgetParent(FileContent* fC, NodeId index) {
if (!fC) return 0;
return fC->Parent(index);
}
unsigned int SURELOG::SLgetLine(FileContent* fC, NodeId index) {
if (!fC) return 0;
return fC->Line(index);
}
std::string SURELOG::SLgetName(FileContent* fC, NodeId index) {
if (!fC) return "";
return fC->SymName(index);
}
NodeId SURELOG::SLgetChild(FileContent* fC, NodeId parent, unsigned int type) {
if (!fC) return 0;
return fC->sl_get(parent, (VObjectType)type);
}
NodeId SURELOG::SLgetParent(FileContent* fC, NodeId parent, unsigned int type) {
if (!fC) return 0;
return fC->sl_parent(parent, (VObjectType)type);
}
std::vector<unsigned int> SURELOG::SLgetAll(FileContent* fC, NodeId parent,
unsigned int type) {
if (!fC) return {};
return fC->sl_get_all(parent, (VObjectType)type);
}
std::vector<unsigned int> SURELOG::SLgetAll(FileContent* fC, NodeId parent,
std::vector<unsigned int> types) {
if (!fC) return {};
std::vector<VObjectType> vtypes;
for (auto type : types) vtypes.push_back((VObjectType)type);
return fC->sl_get_all(parent, vtypes);
}
NodeId SURELOG::SLcollect(FileContent* fC, NodeId parent, unsigned int type) {
if (!fC) return {};
return fC->sl_collect(parent, (VObjectType)type);
}
std::vector<unsigned int> SURELOG::SLcollectAll(FileContent* fC, NodeId parent,
unsigned int type, bool first) {
if (fC)
return fC->sl_collect_all(parent, (VObjectType)type, first);
else
return {};
}
std::vector<unsigned int> SURELOG::SLcollectAll(FileContent* fC, NodeId parent,
std::vector<unsigned int> types,
bool first) {
if (!fC) return {};
std::vector<VObjectType> vtypes;
for (auto type : types) vtypes.push_back((VObjectType)type);
return fC->sl_collect_all(parent, vtypes, first);
}
std::vector<unsigned int> SURELOG::SLcollectAll(
FileContent* fC, NodeId parent, std::vector<unsigned int> types,
std::vector<unsigned int> stopPoints, bool first) {
if (!fC) return {};
std::vector<VObjectType> vtypes;
for (auto type : types) vtypes.push_back((VObjectType)type);
std::vector<VObjectType> vstops;
for (auto type : stopPoints) vstops.push_back((VObjectType)type);
return fC->sl_collect_all(parent, vtypes, vstops, first);
}
unsigned int SURELOG::SLgetnModuleDefinition(Design* design) {
if (!design) return 0;
return design->getModuleDefinitions().size();
}
unsigned int SURELOG::SLgetnProgramDefinition(Design* design) {
if (!design) return 0;
return design->getProgramDefinitions().size();
}
unsigned int SURELOG::SLgetnPackageDefinition(Design* design) {
if (!design) return 0;
return design->getPackageDefinitions().size();
}
unsigned int SURELOG::SLgetnClassDefinition(Design* design) {
if (!design) return 0;
return design->getUniqueClassDefinitions().size();
}
unsigned int SURELOG::SLgetnTopModuleInstance(Design* design) {
if (!design) return 0;
return design->getTopLevelModuleInstances().size();
}
ModuleDefinition* SURELOG::SLgetModuleDefinition(Design* design,
unsigned int index) {
if (!design) return 0;
ModuleNameModuleDefinitionMap::iterator itr =
design->getModuleDefinitions().begin();
for (unsigned int i = 0; i < index; i++) itr++;
return (*itr).second;
}
Program* SURELOG::SLgetProgramDefinition(Design* design, unsigned int index) {
if (!design) return 0;
ProgramNameProgramDefinitionMap::iterator itr =
design->getProgramDefinitions().begin();
for (unsigned int i = 0; i < index; i++) itr++;
return (*itr).second;
}
Package* SURELOG::SLgetPackageDefinition(Design* design, unsigned int index) {
if (!design) return 0;
PackageNamePackageDefinitionMultiMap::iterator itr =
design->getPackageDefinitions().begin();
for (unsigned int i = 0; i < index; i++) itr++;
return (*itr).second;
}
ClassDefinition* SURELOG::SLgetClassDefinition(Design* design,
unsigned int index) {
if (!design) return 0;
ClassNameClassDefinitionMap::iterator itr =
design->getUniqueClassDefinitions().begin();
for (unsigned int i = 0; i < index; i++) itr++;
return (*itr).second;
}
ModuleInstance* SURELOG::SLgetTopModuleInstance(Design* design,
unsigned int index) {
if (!design) return 0;
return design->getTopLevelModuleInstances()[index];
}
std::string SURELOG::SLgetModuleName(ModuleDefinition* module) {
if (!module) return "";
return module->getName();
}
std::string SURELOG::SLgetModuleFile(ModuleDefinition* module) {
if (!module) return "";
if (module->getFileContents().size())
return module->getFileContents()[0]->getFileName(module->getNodeIds()[0]);
else
return "";
}
unsigned int SURELOG::SLgetModuleLine(ModuleDefinition* module) {
if (!module) return 0;
if (module->getFileContents().size())
return module->getFileContents()[0]->Line(module->getNodeIds()[0]);
else
return 0;
}
VObjectType SURELOG::SLgetModuleType(ModuleDefinition* module) {
if (!module) return VObjectType::slNoType;
return module->getType();
}
FileContent* SURELOG::SLgetModuleFileContent(ModuleDefinition* module) {
if (!module) return NULL;
if (module->getFileContents().size())
return module->getFileContents()[0];
else
return NULL;
}
NodeId SURELOG::SLgetModuleRootNode(ModuleDefinition* module) {
if (!module) return 0;
if (module->getFileContents().size())
return module->getNodeIds()[0];
else
return 0;
}
std::string SURELOG::SLgetClassName(ClassDefinition* module) {
if (!module) return "";
return module->getName();
}
std::string SURELOG::SLgetClassFile(ClassDefinition* module) {
if (!module) return "";
if (module->getFileContents().size() && module->getFileContents()[0])
return module->getFileContents()[0]->getFileName(module->getNodeIds()[0]);
else
return "";
}
unsigned int SURELOG::SLgetClassLine(ClassDefinition* module) {
if (!module) return 0;
if (module->getFileContents().size() && module->getFileContents()[0])
return module->getFileContents()[0]->Line(module->getNodeIds()[0]);
else
return 0;
}
VObjectType SURELOG::SLgetClassType(ClassDefinition* module) {
if (!module) return VObjectType::slNoType;
return module->getType();
}
FileContent* SURELOG::SLgetClassFileContent(ClassDefinition* module) {
if (!module) return 0;
if (module->getFileContents().size() && module->getFileContents()[0])
return module->getFileContents()[0];
else
return NULL;
}
NodeId SURELOG::SLgetClassRootNode(ClassDefinition* module) {
if (!module) return 0;
if (module->getFileContents().size() && module->getFileContents()[0])
return module->getNodeIds()[0];
else
return 0;
}
std::string SURELOG::SLgetPackageName(Package* module) {
if (!module) return "";
return module->getName();
}
std::string SURELOG::SLgetPackageFile(Package* module) {
if (!module) return "";
if (module->getFileContents().size())
return module->getFileContents()[0]->getFileName(module->getNodeIds()[0]);
else
return "";
}
unsigned int SURELOG::SLgetPackageLine(Package* module) {
if (!module) return 0;
if (module->getFileContents().size())
return module->getFileContents()[0]->Line(module->getNodeIds()[0]);
else
return 0;
}
VObjectType SURELOG::SLgetPackageType(Package* module) {
if (!module) return VObjectType::slNoType;
return module->getType();
}
FileContent* SURELOG::SLgetPackageFileContent(Package* module) {
if (!module) return 0;
if (module->getFileContents().size())
return module->getFileContents()[0];
else
return NULL;
}
NodeId SURELOG::SLgetPackageRootNode(Package* module) {
if (!module) return 0;
if (module->getFileContents().size())
return module->getNodeIds()[0];
else
return 0;
}
std::string SURELOG::SLgetProgramName(Program* module) {
if (!module) return "";
return module->getName();
}
std::string SURELOG::SLgetProgramFile(Program* module) {
if (!module) return "";
if (module->getFileContents().size())
return module->getFileContents()[0]->getFileName(module->getNodeIds()[0]);
else
return "";
}
unsigned int SURELOG::SLgetProgramLine(Program* module) {
if (!module) return 0;
if (module->getFileContents().size())
return module->getFileContents()[0]->Line(module->getNodeIds()[0]);
else
return 0;
}
VObjectType SURELOG::SLgetProgramType(Program* module) {
if (!module) return VObjectType::slNoType;
return module->getType();
}
FileContent* SURELOG::SLgetProgramFileContent(Program* module) {
if (!module) return 0;
if (module->getFileContents().size())
return module->getFileContents()[0];
else
return NULL;
}
NodeId SURELOG::SLgetProgramRootNode(Program* module) {
if (!module) return 0;
if (module->getFileContents().size())
return module->getNodeIds()[0];
else
return 0;
}
VObjectType SURELOG::SLgetInstanceType(ModuleInstance* instance) {
if (!instance) return VObjectType::slNoType;
return instance->getType();
}
VObjectType SURELOG::SLgetInstanceModuleType(ModuleInstance* instance) {
if (!instance) return VObjectType::slNoType;
return instance->getModuleType();
}
std::string SURELOG::SLgetInstanceName(ModuleInstance* instance) {
if (!instance) return "";
return instance->getInstanceName();
}
std::string SURELOG::SLgetInstanceFullPathName(ModuleInstance* instance) {
if (!instance) return "";
return instance->getFullPathName();
}
std::string SURELOG::SLgetInstanceModuleName(ModuleInstance* instance) {
if (!instance) return "";
return instance->getModuleName();
}
DesignComponent* SURELOG::SLgetInstanceDefinition(ModuleInstance* instance) {
if (!instance) return NULL;
return instance->getDefinition();
}
std::string SURELOG::SLgetInstanceFileName(ModuleInstance* instance) {
if (!instance) return "";
return instance->getFileContent()->getFileName(instance->getNodeId());
}
FileContent* SURELOG::SLgetInstanceFileContent(ModuleInstance* instance) {
if (!instance) return NULL;
return instance->getFileContent();
}
NodeId SURELOG::SLgetInstanceNodeId(ModuleInstance* instance) {
if (!instance) return 0;
return instance->getNodeId();
}
unsigned int SURELOG::SLgetInstanceLine(ModuleInstance* instance) {
if (!instance) return 0;
return instance->getLineNb();
}
unsigned int SURELOG::SLgetnInstanceChildren(ModuleInstance* instance) {
if (!instance) return 0;
return instance->getNbChildren();
}
ModuleInstance* SURELOG::SLgetInstanceChildren(ModuleInstance* instance,
unsigned int i) {
if (!instance) return NULL;
return instance->getChildren(i);
}
ModuleInstance* SURELOG::SLgetInstanceParent(ModuleInstance* instance) {
if (!instance) return NULL;
return instance->getParent();
}