Support "import".
This commit is contained in:
parent
8a55c6fd9f
commit
3b39c3391d
2
Changes
2
Changes
|
|
@ -16,7 +16,7 @@ indicates the contributor was also the author of the fix; Thanks!
|
||||||
|
|
||||||
*** Support "program".
|
*** Support "program".
|
||||||
|
|
||||||
*** Support "package" and $unit.
|
*** Support "package", "import" and $unit.
|
||||||
|
|
||||||
*** Support typedef. [Donal Casey]
|
*** Support typedef. [Donal Casey]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -403,6 +403,10 @@ void AstNodeModule::dump(ostream& str) {
|
||||||
if (modPublic()) str<<" [P]";
|
if (modPublic()) str<<" [P]";
|
||||||
if (inLibrary()) str<<" [LIB]";
|
if (inLibrary()) str<<" [LIB]";
|
||||||
}
|
}
|
||||||
|
void AstPackageImport::dump(ostream& str) {
|
||||||
|
this->AstNode::dump(str);
|
||||||
|
str<<" -> "<<packagep();
|
||||||
|
}
|
||||||
void AstVarScope::dump(ostream& str) {
|
void AstVarScope::dump(ostream& str) {
|
||||||
this->AstNode::dump(str);
|
this->AstNode::dump(str);
|
||||||
if (isCircular()) str<<" [CIRC]";
|
if (isCircular()) str<<" [CIRC]";
|
||||||
|
|
|
||||||
|
|
@ -775,6 +775,23 @@ struct AstPackage : public AstNodeModule {
|
||||||
bool isDollarUnit() const { return name() == dollarUnitName(); }
|
bool isDollarUnit() const { return name() == dollarUnitName(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AstPackageImport : public AstNode {
|
||||||
|
private:
|
||||||
|
// A package import declaration
|
||||||
|
string m_name;
|
||||||
|
AstPackage* m_packagep; // Package hierarchy
|
||||||
|
public:
|
||||||
|
AstPackageImport(FileLine* fl, AstPackage* packagep, const string& name)
|
||||||
|
: AstNode (fl), m_name(name), m_packagep(packagep) {}
|
||||||
|
ASTNODE_NODE_FUNCS(PackageImport, PACKAGEIMPORT)
|
||||||
|
virtual bool broken() const { return (!m_packagep || !m_packagep->brokeExists()); }
|
||||||
|
virtual void cloneRelink() { if (m_packagep && m_packagep->clonep()) m_packagep = m_packagep->clonep()->castPackage(); }
|
||||||
|
virtual void dump(ostream& str);
|
||||||
|
virtual string name() const { return m_name; }
|
||||||
|
AstPackage* packagep() const { return m_packagep; }
|
||||||
|
void packagep(AstPackage* nodep) { m_packagep=nodep; }
|
||||||
|
};
|
||||||
|
|
||||||
struct AstCell : public AstNode {
|
struct AstCell : public AstNode {
|
||||||
// A instantiation cell or interface call (don't know which until link)
|
// A instantiation cell or interface call (don't know which until link)
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -555,6 +555,20 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void visit(AstPackageImport* nodep, AstNUser*) {
|
||||||
|
UINFO(2," Link: "<<nodep<<endl);
|
||||||
|
V3SymTable* srcp = symsFind(nodep->packagep());
|
||||||
|
if (nodep->name()!="*") {
|
||||||
|
AstNode* impp = srcp->findIdFlat(nodep->name());
|
||||||
|
if (!impp) {
|
||||||
|
nodep->v3error("Import object not found: "<<nodep->packagep()->prettyName()<<"::"<<nodep->prettyName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_curVarsp->import(srcp, nodep->name());
|
||||||
|
// No longer needed
|
||||||
|
nodep->unlinkFrBack()->deleteTree(); nodep=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void visit(AstNode* nodep, AstNUser*) {
|
virtual void visit(AstNode* nodep, AstNUser*) {
|
||||||
// Default: Just iterate
|
// Default: Just iterate
|
||||||
nodep->iterateChildren(*this);
|
nodep->iterateChildren(*this);
|
||||||
|
|
|
||||||
|
|
@ -171,15 +171,16 @@ public:
|
||||||
// Lookup the given string as an identifier, return type of the id, scanning upward
|
// Lookup the given string as an identifier, return type of the id, scanning upward
|
||||||
return symCurrentp()->findIdUpward(name);
|
return symCurrentp()->findIdUpward(name);
|
||||||
}
|
}
|
||||||
void import(AstNode* nodep, const string& pkg, const string& id_or_star) {
|
void import(AstNode* packagep, const string& id_or_star) {
|
||||||
// Import from package::id_or_star to this
|
// Import from package::id_or_star to this
|
||||||
AstNode* entp = findEntUpward(pkg);
|
V3SymTable* symp = getTable(packagep);
|
||||||
if (!entp) { // Internal problem, because we earlier found pkg to label it an ID__aPACKAGE
|
if (!symp) { // Internal problem, because we earlier found pkg to label it an ID__aPACKAGE
|
||||||
nodep->v3fatalSrc("Import package not found: "+pkg);
|
packagep->v3fatalSrc("Import package not found");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Walk old sym table and reinsert into current table
|
// Walk old sym table and reinsert into current table
|
||||||
nodep->v3fatalSrc("Unimplemented: import");
|
// We let V3Link report the error instead of us
|
||||||
|
symCurrentp()->import(symp, id_or_star);
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
// CREATORS
|
// CREATORS
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,24 @@ class V3SymTable : public AstNUser {
|
||||||
if (m_upperp) return m_upperp->findIdUpward(name);
|
if (m_upperp) return m_upperp->findIdUpward(name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
bool import(const V3SymTable* srcp, const string& id_or_star) {
|
||||||
|
// Import tokens from source symbol table into this symbol table
|
||||||
|
// Returns true if successful
|
||||||
|
bool any = false;
|
||||||
|
if (id_or_star != "*") {
|
||||||
|
IdNameMap::const_iterator it = srcp->m_idNameMap.find(id_or_star);
|
||||||
|
if (it != m_idNameMap.end()) {
|
||||||
|
reinsert(it->first, it->second);
|
||||||
|
any = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (IdNameMap::const_iterator it=srcp->m_idNameMap.begin(); it!=srcp->m_idNameMap.end(); ++it) {
|
||||||
|
reinsert(it->first, it->second);
|
||||||
|
any = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return any;
|
||||||
|
}
|
||||||
void dump(ostream& os, const string& indent="", bool user4p_is_table=false) const {
|
void dump(ostream& os, const string& indent="", bool user4p_is_table=false) const {
|
||||||
if (user4p_is_table) { AstUser4InUse::check(); }
|
if (user4p_is_table) { AstUser4InUse::check(); }
|
||||||
for (IdNameMap::const_iterator it=m_idNameMap.begin(); it!=m_idNameMap.end(); ++it) {
|
for (IdNameMap::const_iterator it=m_idNameMap.begin(); it!=m_idNameMap.end(); ++it) {
|
||||||
|
|
|
||||||
|
|
@ -371,6 +371,7 @@ escid \\[^ \t\f\r\n]+
|
||||||
"endproperty" { FL; return yENDPROPERTY; }
|
"endproperty" { FL; return yENDPROPERTY; }
|
||||||
"final" { FL; return yFINAL; }
|
"final" { FL; return yFINAL; }
|
||||||
"iff" { FL; return yIFF; }
|
"iff" { FL; return yIFF; }
|
||||||
|
"import" { FL; return yIMPORT; }
|
||||||
"int" { FL; return yINT; }
|
"int" { FL; return yINT; }
|
||||||
"logic" { FL; return yLOGIC; }
|
"logic" { FL; return yLOGIC; }
|
||||||
"longint" { FL; return yLONGINT; }
|
"longint" { FL; return yLONGINT; }
|
||||||
|
|
@ -416,7 +417,6 @@ escid \\[^ \t\f\r\n]+
|
||||||
"forkjoin" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
"forkjoin" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
||||||
"ignore_bins" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
"ignore_bins" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
||||||
"illegal_bins" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
"illegal_bins" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
||||||
"import" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
|
||||||
"inside" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
"inside" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
||||||
"interface" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
"interface" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
||||||
"intersect" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
"intersect" { yyerrorf("Unsupported: SystemVerilog 2005 reserved word not implemented: %s",yytext); }
|
||||||
|
|
|
||||||
|
|
@ -272,6 +272,7 @@ class AstSenTree;
|
||||||
%token<fl> yGENVAR "genvar"
|
%token<fl> yGENVAR "genvar"
|
||||||
%token<fl> yIF "if"
|
%token<fl> yIF "if"
|
||||||
%token<fl> yIFF "iff"
|
%token<fl> yIFF "iff"
|
||||||
|
%token<fl> yIMPORT "import"
|
||||||
%token<fl> yINITIAL "initial"
|
%token<fl> yINITIAL "initial"
|
||||||
%token<fl> yINOUT "inout"
|
%token<fl> yINOUT "inout"
|
||||||
%token<fl> yINPUT "input"
|
%token<fl> yINPUT "input"
|
||||||
|
|
@ -593,6 +594,26 @@ package_or_generate_item_declaration<nodep>: // ==IEEE: package_or_generate_item
|
||||||
| ';' { $$ = NULL; }
|
| ';' { $$ = NULL; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
package_import_declaration<nodep>: // ==IEEE: package_import_declaration
|
||||||
|
yIMPORT package_import_itemList ';' { $$ = $2; }
|
||||||
|
;
|
||||||
|
|
||||||
|
package_import_itemList<nodep>:
|
||||||
|
package_import_item { $$ = $1; }
|
||||||
|
| package_import_itemList ',' package_import_item { $$ = $1->addNextNull($3); }
|
||||||
|
;
|
||||||
|
|
||||||
|
package_import_item<nodep>: // ==IEEE: package_import_item
|
||||||
|
yaID__aPACKAGE yP_COLONCOLON package_import_itemObj
|
||||||
|
{ $$ = new AstPackageImport($<fl>1, $<scp>1->castPackage(), *$3);
|
||||||
|
SYMP->import($<scp>1,*$3); }
|
||||||
|
;
|
||||||
|
|
||||||
|
package_import_itemObj<strp>: // IEEE: part of package_import_item
|
||||||
|
idAny { $<fl>$=$<fl>1; $$=$1; }
|
||||||
|
| '*' { $<fl>$=$<fl>1; static string star="*"; $$=☆ }
|
||||||
|
;
|
||||||
|
|
||||||
//**********************************************************************
|
//**********************************************************************
|
||||||
// Module headers
|
// Module headers
|
||||||
|
|
||||||
|
|
@ -1079,7 +1100,7 @@ data_declaration<nodep>: // ==IEEE: data_declaration
|
||||||
// // VARRESET can't be called here - conflicts
|
// // VARRESET can't be called here - conflicts
|
||||||
data_declarationVar { $$ = $1; }
|
data_declarationVar { $$ = $1; }
|
||||||
| type_declaration { $$ = $1; }
|
| type_declaration { $$ = $1; }
|
||||||
//UNSUP package_import_declaration { $$ = $1; }
|
| package_import_declaration { $$ = $1; }
|
||||||
// // IEEE: virtual_interface_declaration
|
// // IEEE: virtual_interface_declaration
|
||||||
// // "yVIRTUAL yID yID" looks just like a data_declaration
|
// // "yVIRTUAL yID yID" looks just like a data_declaration
|
||||||
// // Therefore the virtual_interface_declaration term isn't used
|
// // Therefore the virtual_interface_declaration term isn't used
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,13 @@ package p;
|
||||||
endfunction
|
endfunction
|
||||||
endpackage
|
endpackage
|
||||||
|
|
||||||
|
package p2;
|
||||||
|
typedef int package2_type_t;
|
||||||
|
function [3:0] plustwo(input [3:0] i);
|
||||||
|
plustwo = i+2;
|
||||||
|
endfunction
|
||||||
|
endpackage
|
||||||
|
|
||||||
module t (/*AUTOARG*/
|
module t (/*AUTOARG*/
|
||||||
// Inputs
|
// Inputs
|
||||||
clk
|
clk
|
||||||
|
|
@ -25,6 +32,8 @@ module t (/*AUTOARG*/
|
||||||
$unit::unit_type_t vdu;
|
$unit::unit_type_t vdu;
|
||||||
p::package_type_t vp;
|
p::package_type_t vp;
|
||||||
|
|
||||||
|
t2 t2 ();
|
||||||
|
|
||||||
initial begin
|
initial begin
|
||||||
if (unit_plusone(1) !== 2) $stop;
|
if (unit_plusone(1) !== 2) $stop;
|
||||||
if ($unit::unit_plusone(1) !== 2) $stop;
|
if ($unit::unit_plusone(1) !== 2) $stop;
|
||||||
|
|
@ -34,3 +43,15 @@ module t (/*AUTOARG*/
|
||||||
$finish;
|
$finish;
|
||||||
end
|
end
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
module t2;
|
||||||
|
import p::*;
|
||||||
|
import p2::plustwo;
|
||||||
|
import p2::package2_type_t;
|
||||||
|
package_type_t vp;
|
||||||
|
package2_type_t vp2;
|
||||||
|
initial begin
|
||||||
|
if (plusone(1) !== 2) $stop;
|
||||||
|
if (plustwo(1) !== 3) $stop;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue