From 410e6ff20332d468574ee0c4806d17b48308ba9e Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Thu, 17 Jan 2013 18:36:20 -0500 Subject: [PATCH] Fix DECLFILENAME warning on . --- src/V3Ast.h | 5 ++++- src/V3AstNodes.h | 13 +++++++++++++ src/V3LinkCells.cpp | 3 ++- src/verilog.y | 5 +---- test_regress/t/t_package.v | 4 ++++ 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/V3Ast.h b/src/V3Ast.h index b56b48619..f78f3a35a 100644 --- a/src/V3Ast.h +++ b/src/V3Ast.h @@ -1736,13 +1736,14 @@ private: bool m_modTrace:1; // Tracing this module bool m_inLibrary:1; // From a library, no error if not used, never top level bool m_dead:1; // LinkDot believes is dead; will remove in Dead visitors + bool m_internal:1; // Internally created int m_level; // 1=top module, 2=cell off top module, ... int m_varNum; // Incrementing variable number public: AstNodeModule(FileLine* fl, const string& name) : AstNode (fl) ,m_name(name), m_origName(name) - ,m_modPublic(false), m_modTrace(false), m_inLibrary(false), m_dead(false) + ,m_modPublic(false), m_modTrace(false), m_inLibrary(false), m_dead(false), m_internal(false) ,m_level(0), m_varNum(0) { } ASTNODE_BASE_FUNCS(NodeModule) virtual void dump(ostream& str); @@ -1769,6 +1770,8 @@ public: bool modTrace() const { return m_modTrace; } void dead(bool flag) { m_dead = flag; } bool dead() const { return m_dead; } + void internal(bool flag) { m_internal = flag; } + bool internal() const { return m_internal; } }; //###################################################################### diff --git a/src/V3AstNodes.h b/src/V3AstNodes.h index 8e46ff6b6..bd7ebb35f 100644 --- a/src/V3AstNodes.h +++ b/src/V3AstNodes.h @@ -4504,11 +4504,14 @@ struct AstNetlist : public AstNode { // Children: MODULEs & CFILEs private: AstTypeTable* m_typeTablep; // Reference to top type table, for faster lookup + AstPackage* m_dollarUnitPkgp; public: AstNetlist() : AstNode(new FileLine("AstRoot",0)) { m_typeTablep = NULL; + m_dollarUnitPkgp = NULL; } ASTNODE_NODE_FUNCS(Netlist, NETLIST) + virtual bool broken() const { return (m_dollarUnitPkgp && !m_dollarUnitPkgp->brokeExists()); } AstNodeModule* modulesp() const { return op1p()->castNodeModule();} // op1 = List of modules AstNodeModule* topModulep() const { return op1p()->castNodeModule(); } // * = Top module in hierarchy (first one added, for now) void addModulep(AstNodeModule* modulep) { addOp1p(modulep); } @@ -4518,6 +4521,16 @@ public: void addMiscsp(AstNode* nodep) { addOp3p(nodep); } AstTypeTable* typeTablep() { return m_typeTablep; } void addTypeTablep(AstTypeTable* nodep) { m_typeTablep = nodep; addMiscsp(nodep); } + AstPackage* dollarUnitPkgp() const { return m_dollarUnitPkgp; } + AstPackage* dollarUnitPkgAddp() { + if (!m_dollarUnitPkgp) { + m_dollarUnitPkgp = new AstPackage(fileline(), AstPackage::dollarUnitName()); + m_dollarUnitPkgp->inLibrary(true); // packages are always libraries; don't want to make them a "top" + m_dollarUnitPkgp->modTrace(false); // may reconsider later + m_dollarUnitPkgp->internal(true); + addModulep(m_dollarUnitPkgp); + } + return m_dollarUnitPkgp; } }; //###################################################################### diff --git a/src/V3LinkCells.cpp b/src/V3LinkCells.cpp index 99a08bba0..db0375624 100644 --- a/src/V3LinkCells.cpp +++ b/src/V3LinkCells.cpp @@ -179,7 +179,8 @@ private: m_modp = nodep; UINFO(2,"Link Module: "<fileline()->filebasenameNoExt() != nodep->prettyName() - && !v3Global.opt.isLibraryFile(nodep->fileline()->filename())) { + && !v3Global.opt.isLibraryFile(nodep->fileline()->filename()) + && !nodep->internal()) { // We only complain once per file, otherwise library-like files have a huge mess of warnings if (m_declfnWarned.find(nodep->fileline()->filename()) == m_declfnWarned.end()) { m_declfnWarned.insert(nodep->fileline()->filename()); diff --git a/src/verilog.y b/src/verilog.y index 65e853c8e..c27ad9113 100644 --- a/src/verilog.y +++ b/src/verilog.y @@ -112,11 +112,8 @@ public: // Find one made earlier? AstPackage* pkgp = SYMP->symRootp()->findIdFlat(AstPackage::dollarUnitName())->nodep()->castPackage(); if (!pkgp) { - pkgp = new AstPackage(fl, AstPackage::dollarUnitName()); - pkgp->inLibrary(true); // packages are always libraries; don't want to make them a "top" - pkgp->modTrace(false); // may reconsider later + pkgp = PARSEP->rootp()->dollarUnitPkgAddp(); GRAMMARP->m_modp = pkgp; GRAMMARP->m_modTypeImpNum = 0; - PARSEP->rootp()->addModulep(pkgp); SYMP->reinsert(pkgp, SYMP->symRootp()); // Don't push/pop scope as they're global } return pkgp; diff --git a/test_regress/t/t_package.v b/test_regress/t/t_package.v index f99db5e01..9a9e34972 100644 --- a/test_regress/t/t_package.v +++ b/test_regress/t/t_package.v @@ -11,6 +11,7 @@ endfunction package p; typedef int package_type_t; + integer pi = 123; function [3:0] plusone(input [3:0] i); plusone = i+1; endfunction @@ -38,6 +39,8 @@ module t (/*AUTOARG*/ if (unit_plusone(1) !== 2) $stop; if ($unit::unit_plusone(1) !== 2) $stop; if (p::plusone(1) !== 2) $stop; + p::pi = 124; + if (p::pi !== 124) $stop; $write("*-* All Finished *-*\n"); $finish; @@ -53,5 +56,6 @@ module t2; initial begin if (plusone(1) !== 2) $stop; if (plustwo(1) !== 3) $stop; + if (p::pi !== 123 && p::pi !== 124) $stop; // may race with other initial, so either value end endmodule