Internals: Pre-elaboration progress towards class parameters.

This commit is contained in:
Wilson Snyder 2022-01-01 12:50:43 -05:00
parent a68a4fc888
commit f96d336b97
5 changed files with 47 additions and 10 deletions

View File

@ -123,7 +123,7 @@ private:
V3GraphVertex* vertex(AstNodeModule* nodep) {
// Return corresponding vertex for this module
if (!nodep->user1p()) nodep->user1p(new LinkCellsVertex(&m_graph, nodep));
return (nodep->user1u().toGraphVertex());
return nodep->user1u().toGraphVertex();
}
AstNodeModule* findModuleSym(const string& modName) {
@ -185,6 +185,9 @@ private:
// Module: Pick up modnames, so we can resolve cells later
VL_RESTORER(m_modp);
{
// For nested modules/classes, child below parent
if (m_modp) new V3GraphEdge{&m_graph, vertex(m_modp), vertex(nodep), 1};
//
m_modp = nodep;
UINFO(4, "Link Module: " << nodep << endl);
if (nodep->fileline()->filebasenameNoExt() != nodep->prettyName()
@ -449,6 +452,18 @@ private:
}
virtual void visit(AstRefDType* nodep) override {
iterateChildren(nodep);
for (AstPin* pinp = nodep->paramsp(); pinp; pinp = VN_AS(pinp->nextp(), Pin)) {
pinp->param(true);
if (pinp->name() == "") pinp->name("__paramNumber" + cvtToStr(pinp->pinNum()));
}
}
virtual void visit(AstClassOrPackageRef* nodep) override {
iterateChildren(nodep);
// Inside a class, an extends or reference to another class
// Note we don't add a V3GraphEdge{vertex(m_modp), vertex(nodep->classOrPackagep()}
// We could for an extends, but for another reference we cannot, as
// it is legal to have classes both with parameters that link to each other
for (AstPin* pinp = nodep->paramsp(); pinp; pinp = VN_AS(pinp->nextp(), Pin)) {
pinp->param(true);
if (pinp->name() == "") pinp->name("__paramNumber" + cvtToStr(pinp->pinNum()));

View File

@ -641,10 +641,11 @@ class ParamProcessor final {
longnamer += "_" + paramSmallName(srcModp, modvarp) + paramValueNumber(exprp);
any_overridesr = true;
} else {
V3Const::constifyParamsEdit(pinp->exprp());
AstConst* const exprp = VN_CAST(pinp->exprp(), Const);
const AstConst* const origp = VN_CAST(modvarp->valuep(), Const);
if (!exprp) {
// if (debug()) pinp->dumpTree(cout, "error:");
if (debug()) pinp->dumpTree(cout, "-nodes: ");
pinp->v3error("Can't convert defparam value to constant: Param "
<< pinp->prettyNameQ() << " of " << nodep->prettyNameQ());
pinp->exprp()->replaceWith(new AstConst(

View File

@ -6225,8 +6225,7 @@ class_item<nodep>: // ==IEEE: class_item
| timeunits_declaration { $$ = $1; }
//UNSUP covergroup_declaration { $$ = $1; }
// // local_parameter_declaration under parameter_declaration
| parameter_declaration ';'
{ $$ = $1; BBUNSUP($2, "Unsupported: class parameters"); } // 1800-2009
| parameter_declaration ';' { $$ = $1; }
| ';' { $$ = nullptr; }
//
| error ';' { $$ = nullptr; }

View File

@ -1,5 +1,30 @@
%Error-UNSUPPORTED: t/t_class_param.v:18:30: Unsupported: class parameters
18 | localparam P = PMINUS1 + 1;
%Error-UNSUPPORTED: t/t_class_param.v:32:11: Unsupported: parameterized classes
: ... In instance t
32 | Cls #(.P(4)) c4;
| ^
... For error description see https://verilator.org/warn/UNSUPPORTED?v=latest
%Error-UNSUPPORTED: t/t_class_param.v:34:12: Unsupported: parameterized classes
: ... In instance t
34 | Wrap #(.PMINUS1(15)) w16;
| ^~~~~~~
%Error-UNSUPPORTED: t/t_class_param.v:7:23: Unsupported: class parameters
: ... In instance t
7 | class Cls #(parameter P = 12);
| ^
%Error-UNSUPPORTED: t/t_class_param.v:17:24: Unsupported: class parameters
: ... In instance t
17 | class Wrap #(parameter PMINUS1 = 3);
| ^~~~~~~
%Error-UNSUPPORTED: t/t_class_param.v:18:15: Unsupported: class parameters
: ... In instance t
18 | localparam P = PMINUS1 + 1;
| ^
%Error-UNSUPPORTED: t/t_class_param.v:19:9: Unsupported: parameterized classes
: ... In instance t
19 | Cls#(P) c1;
| ^
%Error-UNSUPPORTED: t/t_class_param.v:25:14: Unsupported: parameterized classes
: ... In instance t
25 | typedef Cls#(5) Cls5_t;
| ^
%Error: Exiting due to

View File

@ -5,9 +5,6 @@
%Error-UNSUPPORTED: t/t_class_unsup_bad.v:8:1: Unsupported: virtual data type
8 | virtual vi_t vi2;
| ^~~~~~~
%Error-UNSUPPORTED: t/t_class_unsup_bad.v:14:26: Unsupported: class parameters
14 | localparam LOCPAR = 10;
| ^
%Error: t/t_class_unsup_bad.v:29:24: Syntax error: 'const'/'rand'/'randc' not allowed before function/task declaration
29 | const function void func_const; endfunction
| ^~~~~~~~~~