mirror of
https://github.com/verilator/verilator.git
synced 2025-01-04 05:37:48 +00:00
365 lines
9.1 KiB
C++
365 lines
9.1 KiB
C++
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||
//*************************************************************************
|
||
//
|
||
// Copyright 2009-2014 by Wilson Snyder. This program is free software; you can
|
||
// redistribute it and/or modify it under the terms of either the GNU
|
||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||
// Version 2.0.
|
||
//
|
||
// Verilator is distributed in the hope that it will be useful,
|
||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
// GNU General Public License for more details.
|
||
//
|
||
//=========================================================================
|
||
///
|
||
/// \file
|
||
/// \brief Verilator: VPI implementation code
|
||
///
|
||
/// This file must be compiled and linked against all objects
|
||
/// created from Verilator or called by Verilator that use the VPI.
|
||
///
|
||
/// Code available from: http://www.veripool.org/verilator
|
||
///
|
||
//=========================================================================
|
||
|
||
#include "verilated_vpi.h"
|
||
|
||
//======================================================================
|
||
|
||
VerilatedVpi VerilatedVpi::s_s; // Singleton
|
||
vluint8_t* VerilatedVpio::s_freeHead = NULL;
|
||
|
||
//======================================================================
|
||
|
||
const char* VerilatedVpiError::strFromVpiVal(PLI_INT32 vpiVal) {
|
||
static const char *names[] = {
|
||
"*undefined*",
|
||
"vpiBinStrVal",
|
||
"vpiOctStrVal",
|
||
"vpiDecStrVal",
|
||
"vpiHexStrVal",
|
||
"vpiScalarVal",
|
||
"vpiIntVal",
|
||
"vpiRealVal",
|
||
"vpiStringVal",
|
||
"vpiVectorVal",
|
||
"vpiStrengthVal",
|
||
"vpiTimeVal",
|
||
"vpiObjTypeVal",
|
||
"vpiSuppressVal",
|
||
"vpiShortIntVal",
|
||
"vpiLongIntVal",
|
||
"vpiShortRealVal",
|
||
"vpiRawTwoStateVal",
|
||
"vpiRawFourStateVal",
|
||
};
|
||
if (vpiVal < 0) return names[0];
|
||
return names[(vpiVal<=vpiRawFourStateVal)?vpiVal:0];
|
||
}
|
||
const char* VerilatedVpiError::strFromVpiObjType(PLI_INT32 vpiVal) {
|
||
static const char *names[] = {
|
||
"*undefined*",
|
||
"vpiAlways",
|
||
"vpiAssignStmt",
|
||
"vpiAssignment",
|
||
"vpiBegin",
|
||
"vpiCase",
|
||
"vpiCaseItem",
|
||
"vpiConstant",
|
||
"vpiContAssign",
|
||
"vpiDeassign",
|
||
"vpiDefParam",
|
||
"vpiDelayControl",
|
||
"vpiDisable",
|
||
"vpiEventControl",
|
||
"vpiEventStmt",
|
||
"vpiFor",
|
||
"vpiForce",
|
||
"vpiForever",
|
||
"vpiFork",
|
||
"vpiFuncCall",
|
||
"vpiFunction",
|
||
"vpiGate",
|
||
"vpiIf",
|
||
"vpiIfElse",
|
||
"vpiInitial",
|
||
"vpiIntegerVar",
|
||
"vpiInterModPath",
|
||
"vpiIterator",
|
||
"vpiIODecl",
|
||
"vpiMemory",
|
||
"vpiMemoryWord",
|
||
"vpiModPath",
|
||
"vpiModule",
|
||
"vpiNamedBegin",
|
||
"vpiNamedEvent",
|
||
"vpiNamedFork",
|
||
"vpiNet",
|
||
"vpiNetBit",
|
||
"vpiNullStmt",
|
||
"vpiOperation",
|
||
"vpiParamAssign",
|
||
"vpiParameter",
|
||
"vpiPartSelect",
|
||
"vpiPathTerm",
|
||
"vpiPort",
|
||
"vpiPortBit",
|
||
"vpiPrimTerm",
|
||
"vpiRealVar",
|
||
"vpiReg",
|
||
"vpiRegBit",
|
||
"vpiRelease",
|
||
"vpiRepeat",
|
||
"vpiRepeatControl",
|
||
"vpiSchedEvent",
|
||
"vpiSpecParam",
|
||
"vpiSwitch",
|
||
"vpiSysFuncCall",
|
||
"vpiSysTaskCall",
|
||
"vpiTableEntry",
|
||
"vpiTask",
|
||
"vpiTaskCall",
|
||
"vpiTchk",
|
||
"vpiTchkTerm",
|
||
"vpiTimeVar",
|
||
"vpiTimeQueue",
|
||
"vpiUdp",
|
||
"vpiUdpDefn",
|
||
"vpiUserSystf",
|
||
"vpiVarSelect",
|
||
"vpiWait",
|
||
"vpiWhile",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"vpiAttribute",
|
||
"vpiBitSelect",
|
||
"vpiCallback",
|
||
"vpiDelayTerm",
|
||
"vpiDelayDevice",
|
||
"vpiFrame",
|
||
"vpiGateArray",
|
||
"vpiModuleArray",
|
||
"vpiPrimitiveArray",
|
||
"vpiNetArray",
|
||
"vpiRange",
|
||
"vpiRegArray",
|
||
"vpiSwitchArray",
|
||
"vpiUdpArray",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"vpiContAssignBit",
|
||
"vpiNamedEventArray",
|
||
"vpiIndexedPartSelect",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"vpiGenScopeArray",
|
||
"vpiGenScope",
|
||
"vpiGenVar"
|
||
};
|
||
if (vpiVal < 0) return names[0];
|
||
return names[(vpiVal<=vpiGenVar)?vpiVal:0];
|
||
}
|
||
const char* VerilatedVpiError::strFromVpiMethod(PLI_INT32 vpiVal) {
|
||
static const char *names[] = {
|
||
"vpiCondition",
|
||
"vpiDelay",
|
||
"vpiElseStmt",
|
||
"vpiForIncStmt",
|
||
"vpiForInitStmt",
|
||
"vpiHighConn",
|
||
"vpiLhs",
|
||
"vpiIndex",
|
||
"vpiLeftRange",
|
||
"vpiLowConn",
|
||
"vpiParent",
|
||
"vpiRhs",
|
||
"vpiRightRange",
|
||
"vpiScope",
|
||
"vpiSysTfCall",
|
||
"vpiTchkDataTerm",
|
||
"vpiTchkNotifier",
|
||
"vpiTchkRefTerm",
|
||
"vpiArgument",
|
||
"vpiBit",
|
||
"vpiDriver",
|
||
"vpiInternalScope",
|
||
"vpiLoad",
|
||
"vpiModDataPathIn",
|
||
"vpiModPathIn",
|
||
"vpiModPathOut",
|
||
"vpiOperand",
|
||
"vpiPortInst",
|
||
"vpiProcess",
|
||
"vpiVariables",
|
||
"vpiUse",
|
||
"vpiExpr",
|
||
"vpiPrimitive",
|
||
"vpiStmt"
|
||
};
|
||
if (vpiVal>vpiStmt || vpiVal<vpiCondition) {
|
||
return "*undefined*";
|
||
}
|
||
return names[vpiVal-vpiCondition];
|
||
}
|
||
const char* VerilatedVpiError::strFromVpiCallbackReason(PLI_INT32 vpiVal) {
|
||
static const char *names[] = {
|
||
"*undefined*",
|
||
"cbValueChange",
|
||
"cbStmt",
|
||
"cbForce",
|
||
"cbRelease",
|
||
"cbAtStartOfSimTime",
|
||
"cbReadWriteSynch",
|
||
"cbReadOnlySynch",
|
||
"cbNextSimTime",
|
||
"cbAfterDelay",
|
||
"cbEndOfCompile",
|
||
"cbStartOfSimulation",
|
||
"cbEndOfSimulation",
|
||
"cbError",
|
||
"cbTchkViolation",
|
||
"cbStartOfSave",
|
||
"cbEndOfSave",
|
||
"cbStartOfRestart",
|
||
"cbEndOfRestart",
|
||
"cbStartOfReset",
|
||
"cbEndOfReset",
|
||
"cbEnterInteractive",
|
||
"cbExitInteractive",
|
||
"cbInteractiveScopeChange",
|
||
"cbUnresolvedSystf",
|
||
"cbAssign",
|
||
"cbDeassign",
|
||
"cbDisable",
|
||
"cbPLIError",
|
||
"cbSignal",
|
||
"cbNBASynch",
|
||
"cbAtEndOfSimTime"
|
||
};
|
||
if (vpiVal < 0) return names[0];
|
||
return names[(vpiVal<=cbAtEndOfSimTime)?vpiVal:0];
|
||
}
|
||
const char* VerilatedVpiError::strFromVpiProp(PLI_INT32 vpiVal) {
|
||
static const char *names[] = {
|
||
"*undefined or other*",
|
||
"vpiType",
|
||
"vpiName",
|
||
"vpiFullName",
|
||
"vpiSize",
|
||
"vpiFile",
|
||
"vpiLineNo",
|
||
"vpiTopModule",
|
||
"vpiCellInstance",
|
||
"vpiDefName",
|
||
"vpiProtected",
|
||
"vpiTimeUnit",
|
||
"vpiTimePrecision",
|
||
"vpiDefNetType",
|
||
"vpiUnconnDrive",
|
||
"vpiDefFile",
|
||
"vpiDefLineNo",
|
||
"vpiScalar",
|
||
"vpiVector",
|
||
"vpiExplicitName",
|
||
"vpiDirection",
|
||
"vpiConnByName",
|
||
"vpiNetType",
|
||
"vpiExplicitScalared",
|
||
"vpiExplicitVectored",
|
||
"vpiExpanded",
|
||
"vpiImplicitDecl",
|
||
"vpiChargeStrength",
|
||
"vpiArray",
|
||
"vpiPortIndex",
|
||
"vpiTermIndex",
|
||
"vpiStrength0",
|
||
"vpiStrength1",
|
||
"vpiPrimType",
|
||
"vpiPolarity",
|
||
"vpiDataPolarity",
|
||
"vpiEdge",
|
||
"vpiPathType",
|
||
"vpiTchkType",
|
||
"vpiOpType",
|
||
"vpiConstType",
|
||
"vpiBlocking",
|
||
"vpiCaseType",
|
||
"vpiFuncType",
|
||
"vpiNetDeclAssign",
|
||
"vpiUserDefn",
|
||
"vpiScheduled",
|
||
"*undefined*",
|
||
"*undefined*",
|
||
"vpiActive",
|
||
"vpiAutomatic",
|
||
"vpiCell",
|
||
"vpiConfig",
|
||
"vpiConstantSelect",
|
||
"vpiDecompile",
|
||
"vpiDefAttribute",
|
||
"vpiDelayType",
|
||
"vpiIteratorType",
|
||
"vpiLibrary",
|
||
"*undefined*",
|
||
"vpiOffset",
|
||
"vpiResolvedNetType",
|
||
"vpiSaveRestartID",
|
||
"vpiSaveRestartLocation",
|
||
"vpiValid",
|
||
"vpiSigned",
|
||
"vpiStop",
|
||
"vpiFinish",
|
||
"vpiReset",
|
||
"vpiSetInteractiveScope",
|
||
"vpiLocalParam",
|
||
"vpiModPathHasIfNone",
|
||
"vpiIndexedPartSelectType",
|
||
"vpiIsMemory",
|
||
"vpiIsProtected"
|
||
};
|
||
if (vpiVal == vpiUndefined) {
|
||
return "vpiUndefined";
|
||
}
|
||
return names[(vpiVal<=vpiIsProtected)?vpiVal:0];
|
||
}
|