Skip to content
This repository was archived by the owner on Feb 27, 2024. It is now read-only.

Commit f8acbc2

Browse files
authored
Merge pull request #611 from antmicro/rk/parameter-fixes
Parameter handling fixes
2 parents 6332f02 + 494f952 commit f8acbc2

File tree

4 files changed

+45
-5
lines changed

4 files changed

+45
-5
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ jobs:
668668
- name: Generate matrix (vcddiff)
669669
id: generate-matrix-vcddiff
670670
run: |
671-
matrix="$(cd uhdm-integration && python list.py -d tests -s ibex swerv synthesis opentitan hello-uvm assignment-pattern Forever BitsCallOnType OneClass Continue AnonymousUnion FunctionOnDesignLevel ParameterUnpackedArray VoidFunction2Returns PatternStruct ImportedFunctionCallInModuleAndSubmodule VoidFunctionWithoutReturn cmake PutC OneThis CastInFunctionInGenBlock PatternType FunctionOutputArgument GetC ForkJoinTypes EnumFirstInInitial ImportFunction DpiChandle Disable EnumFirst TypedefOnFileLevel UnsizedConstantsParameterParsing Fork PatternInFunction TypedefVariableDimensions ParameterUnpackedLogicArray SelectFromUnpackedInFunction PatternReplication VoidFunction MultiplePrints BitSelectPartSelectInFunction ImportPackageWithFunction ParameterPackedArray StringAssignment SystemFunctions 2DFunctionArg ArrayInit array-copy FunctionColonReference ParameterColonReference ParameterSizeOfInstance PkgParamAsFunctionArg xor_assignment fsm_using_always OneNetInterf cs_registers UnpackedArray InterfaceAssign fsm_using_function OneNetRange ParameterWithUnderscoreValueDividedPassedFromCommandLine FunctionExportDPI OnePackage InterfaceInitial InterfaceAlways OneCast fsm_single_always TaskExportDPI OneImport hier_path CastStructArray InterfaceAsPort ParameterInitializedByPartSelectOfParameters ParameterInitializedByPartSelectOfParametersAssignedToVar StringAssignment EnumParameterInNestedModules 2DeclarationsInFor 1DUnpackedArray 2DUnpackedArray ArraySize AssignBitsCallToSubmoduleParameter DeclarationInFor EnumArrayListedElements EnumArray DivisionOfSize ImportedPackageEnumItemInInterface InterfaceVariable ConstSizes InterfaceParameterSetValue InterfaceWithPort InterfaceAsPortAssignValueInSubmodule InterfaceParameter LogicPackedArray NestedParamSubstitution MultiAssignmentPatternOfConcat MixedPatterns NegationOfPatternParameterInInstance OneArithShift ParameterPackedArraySurelogSubstitution PatternDefault PatternAsParameterOfInstance Repeat Shortreal TypedefedRangedFunctionArgument RealValue TaskImportDPI TaskOutputArgument TypedefAliasInPackage PartSelectOfPartSelectedBitSelect TaskReturn PatternAsFunctionArgument PatternIndexes ReturnEnumArray unary_op_minus TypedefPackedDimensions unary_op_plus UnsizedConstantParameter unary_op_not_log UnsizedConstantParameterInInstance UnsizedConstantsParsing UnsizedConstant FunctionWithOverriddenParameter ImportedDoubleCastedParameter ImportedEnumCast ParameterInitializationWithNegation StringAssignConcatenation StringLocalParamInitByConcatenation StructParameterInitializedWithPatternAndReferenced StringWithBackslash serv-minimal serv conditional_if AssignSumOfConstants AssignSumOfConstantsInSubmodule AssignSumWithParameter AssignSumWithParameterInSubmodule CastClog2 CastClog2ToMinimalSizeOfParamValue CastClog2ToMinimalSizeOfParamValueFromCommandLine CastToSumOfConstants CastToSumWithParameterInSubmodule Clog2OfSumWithParameterIn2InstancesOfSubmodule OutputSizeWithParameterOfInstanceInitializedByStructMember ParameterInGenScopeInitializedWithLongConstant)"
671+
matrix="$(cd uhdm-integration && python list.py -d tests -s ibex swerv synthesis opentitan hello-uvm assignment-pattern Forever BitsCallOnType OneClass Continue AnonymousUnion FunctionOnDesignLevel ParameterUnpackedArray VoidFunction2Returns PatternStruct ImportedFunctionCallInModuleAndSubmodule VoidFunctionWithoutReturn cmake PutC OneThis CastInFunctionInGenBlock PatternType FunctionOutputArgument GetC ForkJoinTypes EnumFirstInInitial ImportFunction DpiChandle Disable EnumFirst TypedefOnFileLevel UnsizedConstantsParameterParsing Fork PatternInFunction TypedefVariableDimensions ParameterUnpackedLogicArray SelectFromUnpackedInFunction PatternReplication VoidFunction MultiplePrints BitSelectPartSelectInFunction ImportPackageWithFunction ParameterPackedArray StringAssignment SystemFunctions 2DFunctionArg ArrayInit array-copy FunctionColonReference ParameterColonReference ParameterSizeOfInstance PkgParamAsFunctionArg xor_assignment fsm_using_always OneNetInterf cs_registers UnpackedArray InterfaceAssign fsm_using_function OneNetRange ParameterWithUnderscoreValueDividedPassedFromCommandLine FunctionExportDPI OnePackage InterfaceInitial InterfaceAlways OneCast fsm_single_always TaskExportDPI OneImport hier_path CastStructArray InterfaceAsPort ParameterInitializedByPartSelectOfParameters ParameterInitializedByPartSelectOfParametersAssignedToVar StringAssignment EnumParameterInNestedModules 2DeclarationsInFor 1DUnpackedArray 2DUnpackedArray ArraySize AssignBitsCallToSubmoduleParameter DeclarationInFor EnumArrayListedElements EnumArray DivisionOfSize ImportedPackageEnumItemInInterface InterfaceVariable ConstSizes InterfaceParameterSetValue InterfaceWithPort InterfaceAsPortAssignValueInSubmodule InterfaceParameter LogicPackedArray NestedParamSubstitution MultiAssignmentPatternOfConcat MixedPatterns NegationOfPatternParameterInInstance OneArithShift ParameterPackedArraySurelogSubstitution PatternDefault PatternAsParameterOfInstance Repeat Shortreal TypedefedRangedFunctionArgument RealValue TaskImportDPI TaskOutputArgument TypedefAliasInPackage PartSelectOfPartSelectedBitSelect TaskReturn PatternAsFunctionArgument PatternIndexes ReturnEnumArray unary_op_minus TypedefPackedDimensions unary_op_plus UnsizedConstantParameter unary_op_not_log UnsizedConstantParameterInInstance UnsizedConstantsParsing UnsizedConstant FunctionWithOverriddenParameter ImportedDoubleCastedParameter ImportedEnumCast ParameterInitializationWithNegation StringAssignConcatenation StringLocalParamInitByConcatenation StructParameterInitializedWithPatternAndReferenced StringWithBackslash serv-minimal serv conditional_if AssignSumOfConstants AssignSumOfConstantsInSubmodule AssignSumWithParameter AssignSumWithParameterInSubmodule CastClog2 CastClog2ToMinimalSizeOfParamValue CastClog2ToMinimalSizeOfParamValueFromCommandLine CastToSumOfConstants CastToSumWithParameterInSubmodule Clog2OfSumWithParameterIn2InstancesOfSubmodule OutputSizeWithParameterOfInstanceInitializedByStructMember ParameterInGenScopeInitializedWithLongConstant ImportedParameter ImportTypeOfPort ImportParametrizedTypeAndDeclareParamWithTheSameName ParameterPassedToSubmoduleOfSubmodule ParameterPassedTo3TimesNestedSubmodule ParameterPassedToSubmoduleInGenscopeOfSubmodule ParameterInitializedInTopOf5LevelHierarchy ParameterInitializedInSubModuleOfTopOf5LevelHierarchy ParameterInitializedInTopOf5LevelHierarchyWithUnusedParamInTheMiddle ParameterInitializedInTopOf5LevelHierarchyWithUnusedParamOfDifferentTypeInTheMiddle)"
672672
echo "::set-output name=matrix::$matrix"
673673
echo "matrix vcddiff: $matrix"
674674

src/UhdmAst.cpp

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,17 +1276,45 @@ AstMethodCall* process_method_call(vpiHandle obj_h, AstNode* fromp, UhdmShared&
12761276
AstNode* process_hierPath(vpiHandle obj_h, UhdmShared& shared) {
12771277
AstNode* hierPathp = nullptr;
12781278
AstNode* hierItemp = nullptr;
1279+
FileLine* fl = make_fileline(obj_h);
1280+
bool expr_const_present = false;
1281+
std::string objectName;
1282+
1283+
if (vpiHandle expr_h = vpi_handle(vpiExpr, obj_h)) {
1284+
if (vpi_get(vpiType, expr_h) == vpiConstant) {
1285+
expr_const_present = true;
1286+
objectName = get_object_name(obj_h);
1287+
objectName = std::regex_replace(objectName, std::regex("\\."), "_");
1288+
1289+
AstNode* constp = get_value_as_node(expr_h, true);
1290+
vpiHandle typespec_h = vpi_handle(vpiTypespec, obj_h);
1291+
AstNodeDType* dtypep = getDType(fl, typespec_h, shared);
1292+
vpi_release_handle(typespec_h);
1293+
1294+
std::string moduleName = shared.moduleNamesStack.top();
1295+
AstVar* temporaryParam = new AstVar(fl, AstVarType::LPARAM, objectName, VFlagChildDType(), dtypep);
1296+
temporaryParam->valuep(constp);
1297+
1298+
shared.top_param_map[moduleName][objectName] = temporaryParam;
1299+
}
1300+
vpi_release_handle(expr_h);
1301+
}
12791302

12801303
vpiHandle actual_itr = vpi_iterate(vpiActual, obj_h);
12811304
while (vpiHandle actual_h = vpi_scan(actual_itr)) {
12821305
if(vpi_get(vpiType, actual_h) == vpiMethodFuncCall) {
12831306
hierPathp = process_method_call(actual_h, hierPathp, shared);
12841307
} else {
1285-
hierItemp = visit_object(actual_h, shared);
1308+
if (expr_const_present) {
1309+
hierItemp = get_referenceNode(make_fileline(obj_h), objectName, shared);
1310+
expr_const_present = false;
1311+
} else {
1312+
hierItemp = visit_object(actual_h, shared);
1313+
}
12861314
if (hierPathp == nullptr)
12871315
hierPathp = hierItemp;
12881316
else
1289-
hierPathp = new AstDot(make_fileline(obj_h), false, hierPathp, hierItemp);
1317+
hierPathp = new AstDot(fl, false, hierPathp, hierItemp);
12901318
}
12911319
vpi_release_handle(actual_h);
12921320
}
@@ -1622,7 +1650,15 @@ AstNode* process_typedef(vpiHandle obj_h, UhdmShared& shared) {
16221650
std::string objectName = get_object_name(obj_h);
16231651

16241652
auto pos = objectName.rfind("::");
1625-
if (pos != std::string::npos) objectName = objectName.substr(pos + 2);
1653+
if (pos != std::string::npos) {
1654+
std::string packageName = objectName.substr(0, pos + 2);
1655+
std::string baseName = objectName.substr(pos + 2);
1656+
if (packageName != shared.package_prefix) {
1657+
return get_type_reference(make_fileline(obj_h), baseName, objectName, shared);
1658+
} else {
1659+
objectName = baseName;
1660+
}
1661+
}
16261662

16271663
AstNodeDType* refp = nullptr;
16281664
if (vpiHandle alias_h = vpi_handle(vpiTypedefAlias, obj_h)) {
@@ -1893,6 +1929,7 @@ AstNode* visit_object(vpiHandle obj_h, UhdmShared& shared) {
18931929
case vpiModule: {
18941930
std::string modDefName = get_object_name(obj_h, {vpiDefName});
18951931
std::string modType = modDefName;
1932+
shared.moduleNamesStack.push(modDefName);
18961933
remove_scope(modType);
18971934
AstModule* module;
18981935

@@ -1902,6 +1939,7 @@ AstNode* visit_object(vpiHandle obj_h, UhdmShared& shared) {
19021939
if (it != shared.top_nodes.end()) {
19031940
// Was created before, fill missing
19041941
module = reinterpret_cast<AstModule*>(it->second);
1942+
19051943
// If available, check vpiFullName instead of vpiName, as vpiName can equal vpiDefName
19061944
std::string fullName = objectName;
19071945
if (auto* s = vpi_get_str(vpiFullName, obj_h)) {
@@ -2041,6 +2079,7 @@ AstNode* visit_object(vpiHandle obj_h, UhdmShared& shared) {
20412079
if (v3Global.opt.trace()) { module->modTrace(true); }
20422080
shared.top_param_map[modDefName] = param_map;
20432081
}
2082+
shared.moduleNamesStack.pop();
20442083

20452084
// If available, check vpiFullName instead of vpiName, as vpiName can equal vpiDefName
20462085
std::string fullName = objectName;

src/UhdmAst.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct UhdmShared {
2121
// Store parameters here (values can be updated for each instance)
2222
// Final values will be added in respective module/package
2323
std::map<std::string, NameNodeMap> top_param_map;
24+
std::stack<std::string> moduleNamesStack;
2425
std::set<std::tuple<std::string, int, std::string>> coverage_set;
2526
V3ParseSym* m_symp;
2627
// Used to distinguish between task/function calls inside statement hierarchy

uhdm-integration

Submodule uhdm-integration updated 44 files

0 commit comments

Comments
 (0)