Internals: Cleanup V3EmitV to allow filename prefixing

This commit is contained in:
Wilson Snyder 2009-12-28 22:19:03 -05:00
parent f3347be629
commit be6454193b
4 changed files with 176 additions and 144 deletions

View File

@ -1019,7 +1019,7 @@ struct AstNodeCond : public AstNodeTriop {
AstNode* condp() const { return op1p()->castNode(); } // op1 = Condition
AstNode* expr1p() const { return op2p()->castNode(); } // op2 = If true...
AstNode* expr2p() const { return op3p()->castNode(); } // op3 = If false...
virtual string emitVerilog() { return "%k(%l %k? %r %k: %t)"; }
virtual string emitVerilog() { return "%k(%l %f? %r %k: %t)"; }
virtual string emitC() { return "VL_COND_%nq%lq%rq%tq(%nw,%lw,%rw,%tw, %P, %li, %ri, %ti)"; }
virtual bool cleanOut() { return false; } // clean if e1 & e2 clean
virtual bool cleanLhs() { return true; }
@ -1076,6 +1076,7 @@ struct AstNodeAssign : public AstNodeStmt {
virtual int instrCount() const { return widthInstrs(); }
virtual V3Hash sameHash() const { return V3Hash(); }
virtual bool same(AstNode*) const { return true; }
virtual string verilogKwd() const { return "="; }
};
struct AstNodeFor : public AstNodeStmt {

View File

@ -214,10 +214,7 @@ public:
virtual V3Hash sameHash() const { return V3Hash(keyword()); }
virtual bool same(AstNode* samep) const {
return samep->castBasicDType()->keyword() == keyword(); }
virtual string name() const {
if (rangep()) return string(m_keyword.ascii())+"[]";
else return m_keyword.ascii();
}
virtual string name() const { return m_keyword.ascii(); }
AstRange* rangep() const { return op1p()->castRange(); } // op1 = Range of variable
void rangep(AstRange* nodep) { setNOp1p(nodep); }
void setSignedState(AstSignedState signst) {
@ -359,7 +356,7 @@ struct AstArraySel : public AstNodeSel {
ASTNODE_NODE_FUNCS(ArraySel, ARRAYSEL)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) {
V3ERROR_NA; /* How can from be a const? */ }
virtual string emitVerilog() { return "%k(%l%k[%r])"; }
virtual string emitVerilog() { return "%k(%l%f[%r])"; }
virtual string emitC() { return "%li%k[%ri]"; }
virtual bool cleanOut() { return true; }
virtual bool cleanLhs() {return false;} virtual bool cleanRhs() {return true;}
@ -382,7 +379,7 @@ struct AstWordSel : public AstNodeSel {
}
ASTNODE_NODE_FUNCS(WordSel, WORDSEL)
virtual void numberOperate(V3Number& out, const V3Number& from, const V3Number& bit) { V3ERROR_NA; }
virtual string emitVerilog() { return "%k(%l[%r])"; } // Not %k, as usually it's a small constant rhsp
virtual string emitVerilog() { return "%k(%l%f[%r])"; }
virtual string emitC() { return "%li[%ri]"; } // Not %k, as usually it's a small constant rhsp
virtual bool cleanOut() { return true; }
virtual bool cleanLhs() { return true; } virtual bool cleanRhs() { return true; }
@ -1126,7 +1123,7 @@ struct AstSenGate : public AstNodeSenItem {
width(1,1); addOp1p(sensesp); setOp2p(rhsp);
}
ASTNODE_NODE_FUNCS(SenGate, SENGATE)
virtual string emitVerilog() { return "(%l) && (%r)"; }
virtual string emitVerilog() { return "(%l) %f&& (%r)"; }
AstSenItem* sensesp() const { return op1p()->castSenItem(); }
AstNode* rhsp() const { return op2p()->castNode(); }
void sensesp(AstSenItem* nodep) { addOp1p(nodep); }
@ -1197,7 +1194,6 @@ struct AstAssign : public AstNodeAssign {
}
ASTNODE_NODE_FUNCS(Assign, ASSIGN)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstAssign(this->fileline(), lhsp, rhsp); }
virtual string verilogKwd() const { return "="; }
};
struct AstAssignAlias : public AstNodeAssign {
@ -1813,7 +1809,7 @@ struct AstChangeXor : public AstNodeBiComAsv {
width(32,32); }
ASTNODE_NODE_FUNCS(ChangeXor, CHANGEXOR)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opChangeXor(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l ^ %r)"; }
virtual string emitVerilog() { return "%k(%l %f^ %r)"; }
virtual string emitC() { return "VL_CHANGEXOR_%li(%lw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "^"; }
virtual bool cleanOut() {return false;} // Lclean && Rclean
@ -2114,7 +2110,7 @@ public:
width(wwidth,wwidth); m_reset=reset; }
AstRand(FileLine* fl) : AstNodeTermop(fl), m_reset(false) { }
ASTNODE_NODE_FUNCS(Rand, RAND)
virtual string emitVerilog() { return "$random"; }
virtual string emitVerilog() { return "%f$random"; }
virtual string emitC() {
return (m_reset ?
"VL_RAND_RESET_%nq(%nw, %P)"
@ -2131,7 +2127,7 @@ struct AstTime : public AstNodeTermop {
AstTime(FileLine* fl) : AstNodeTermop(fl) {
width(64,64); }
ASTNODE_NODE_FUNCS(Time, TIME)
virtual string emitVerilog() { return "$time"; }
virtual string emitVerilog() { return "%f$time"; }
virtual string emitC() { return "VL_TIME_%nq()"; }
virtual bool cleanOut() { return true; }
virtual bool isGateOptimizable() const { return false; }
@ -2171,7 +2167,7 @@ struct AstUnaryMin : public AstNodeUniop {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(UnaryMin, UNARYMIN)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opUnaryMin(lhs); }
virtual string emitVerilog() { return "%k(- %l)"; }
virtual string emitVerilog() { return "%f(- %l)"; }
virtual string emitC() { return "VL_UNARYMIN_%lq(%lW, %P, %li)"; }
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return false;}
virtual bool sizeMattersLhs() {return true;}
@ -2181,7 +2177,7 @@ struct AstRedAnd : public AstNodeUniop {
width(1,1); }
ASTNODE_NODE_FUNCS(RedAnd, REDAND)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opRedAnd(lhs); }
virtual string emitVerilog() { return "%k(& %l)"; }
virtual string emitVerilog() { return "%f(& %l)"; }
virtual string emitC() { return "VL_REDAND_%nq%lq(%nw,%lw, %P, %li)"; }
virtual bool cleanOut() {return true;} virtual bool cleanLhs() {return true;}
virtual bool sizeMattersLhs() {return false;}
@ -2191,7 +2187,7 @@ struct AstRedOr : public AstNodeUniop {
width(1,1); }
ASTNODE_NODE_FUNCS(RedOr, REDOR)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opRedOr(lhs); }
virtual string emitVerilog() { return "%k(| %l)"; }
virtual string emitVerilog() { return "%f(| %l)"; }
virtual string emitC() { return "VL_REDOR_%lq(%lW, %P, %li)"; }
virtual bool cleanOut() {return true;} virtual bool cleanLhs() {return true;}
virtual bool sizeMattersLhs() {return false;}
@ -2201,7 +2197,7 @@ struct AstRedXor : public AstNodeUniop {
width(1,1); }
ASTNODE_NODE_FUNCS(RedXor, REDXOR)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opRedXor(lhs); }
virtual string emitVerilog() { return "%k(^ %l)"; }
virtual string emitVerilog() { return "%f(^ %l)"; }
virtual string emitC() { return "VL_REDXOR_%lq(%lW, %P, %li)"; }
virtual bool cleanOut() {return false;}
virtual bool cleanLhs() {return (lhsp()->width()!=1 && lhsp()->width()!=2 && lhsp()->width()!=4
@ -2215,7 +2211,7 @@ struct AstRedXnor : public AstNodeUniop {
width(1,1); }
ASTNODE_NODE_FUNCS(RedXnor, REDXNOR)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opRedXnor(lhs); }
virtual string emitVerilog() { return "%k(~^ %l)"; }
virtual string emitVerilog() { return "%f(~^ %l)"; }
virtual string emitC() { v3fatalSrc("REDXNOR should have became REDXOR"); return ""; }
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return true;}
virtual bool sizeMattersLhs() {return false;}
@ -2227,7 +2223,7 @@ struct AstLogNot : public AstNodeUniop {
width(1,1); }
ASTNODE_NODE_FUNCS(LogNot, LOGNOT)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opLogNot(lhs); }
virtual string emitVerilog() { return "%k(! %l)"; }
virtual string emitVerilog() { return "%f(! %l)"; }
virtual string emitC() { return "VL_LOGNOT_%nq%lq(%nw,%lw, %P, %li)"; }
virtual string emitSimpleOperator() { return "!"; }
virtual bool cleanOut() {return true;} virtual bool cleanLhs() {return true;}
@ -2238,7 +2234,7 @@ struct AstNot : public AstNodeUniop {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(Not, NOT)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opNot(lhs); }
virtual string emitVerilog() { return "%k(~ %l)"; }
virtual string emitVerilog() { return "%f(~ %l)"; }
virtual string emitC() { return "VL_NOT_%lq(%lW, %P, %li)"; }
virtual string emitSimpleOperator() { return "~"; }
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return false;}
@ -2274,7 +2270,7 @@ struct AstSigned : public AstNodeUniop {
}
ASTNODE_NODE_FUNCS(Signed, SIGNED)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opAssign(lhs); out.isSigned(false); }
virtual string emitVerilog() { return "%k$signed(%l)"; }
virtual string emitVerilog() { return "%f$signed(%l)"; }
virtual string emitC() { V3ERROR_NA; return ""; }
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return false;} // Eliminated before matters
virtual bool sizeMattersLhs() {return true;} // Eliminated before matters
@ -2287,7 +2283,7 @@ struct AstUnsigned : public AstNodeUniop {
}
ASTNODE_NODE_FUNCS(Unsigned, UNSIGNED)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opAssign(lhs); out.isSigned(false); }
virtual string emitVerilog() { return "%k$unsigned(%l)"; }
virtual string emitVerilog() { return "%f$unsigned(%l)"; }
virtual string emitC() { V3ERROR_NA; return ""; }
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return false;} // Eliminated before matters
virtual bool sizeMattersLhs() {return true;} // Eliminated before matters
@ -2297,7 +2293,7 @@ struct AstCLog2 : public AstNodeUniop {
AstCLog2(FileLine* fl, AstNode* lhsp) : AstNodeUniop(fl, lhsp) {}
ASTNODE_NODE_FUNCS(CLog2, CLOG2)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opCLog2(lhs); }
virtual string emitVerilog() { return "%k$clog2(%l)"; }
virtual string emitVerilog() { return "%f$clog2(%l)"; }
virtual string emitC() { return "VL_CLOG2_%lq(%lW, %P, %li)"; }
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return true;}
virtual bool sizeMattersLhs() {return false;}
@ -2308,7 +2304,7 @@ struct AstCountOnes : public AstNodeUniop {
AstCountOnes(FileLine* fl, AstNode* lhsp) : AstNodeUniop(fl, lhsp) {}
ASTNODE_NODE_FUNCS(CountOnes, COUNTONES)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opCountOnes(lhs); }
virtual string emitVerilog() { return "%k$countones(%l)"; }
virtual string emitVerilog() { return "%f$countones(%l)"; }
virtual string emitC() { return "VL_COUNTONES_%lq(%lW, %P, %li)"; }
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return true;}
virtual bool sizeMattersLhs() {return false;}
@ -2320,7 +2316,7 @@ struct AstIsUnknown : public AstNodeUniop {
width(1,1);}
ASTNODE_NODE_FUNCS(IsUnknown, ISUNKNOWN)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opIsUnknown(lhs); }
virtual string emitVerilog() { return "%k$isunknown(%l)"; }
virtual string emitVerilog() { return "%f$isunknown(%l)"; }
virtual string emitC() { V3ERROR_NA; return ""; }
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return false;}
virtual bool sizeMattersLhs() {return false;}
@ -2331,7 +2327,7 @@ struct AstOneHot : public AstNodeUniop {
width(1,1);}
ASTNODE_NODE_FUNCS(OneHot, ONEHOT)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opOneHot(lhs); }
virtual string emitVerilog() { return "%k$onehot(%l)"; }
virtual string emitVerilog() { return "%f$onehot(%l)"; }
virtual string emitC() { return "VL_ONEHOT_%lq(%lW, %P, %li)"; }
virtual bool cleanOut() {return true;} virtual bool cleanLhs() {return true;}
virtual bool sizeMattersLhs() {return false;}
@ -2343,7 +2339,7 @@ struct AstOneHot0 : public AstNodeUniop {
width(1,1);}
ASTNODE_NODE_FUNCS(OneHot0, ONEHOT0)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opOneHot0(lhs); }
virtual string emitVerilog() { return "%k$onehot0(%l)"; }
virtual string emitVerilog() { return "%f$onehot0(%l)"; }
virtual string emitC() { return "VL_ONEHOT0_%lq(%lW, %P, %li)"; }
virtual bool cleanOut() {return true;} virtual bool cleanLhs() {return true;}
virtual bool sizeMattersLhs() {return false;}
@ -2365,7 +2361,7 @@ public:
}
ASTNODE_NODE_FUNCS(Cast, CAST)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opAssign(lhs); }
virtual string emitVerilog() { return "%k$_CAST(%l)"; }
virtual string emitVerilog() { return "%f$_CAST(%l)"; }
virtual string emitC() { return "VL_CAST_%nq%lq(%nw,%lw, %P, %li)"; }
virtual bool cleanOut() {return true;} virtual bool cleanLhs() {return true;}
virtual bool sizeMattersLhs() {return false;} // Special cased in V3Cast
@ -2380,7 +2376,7 @@ struct AstFEof : public AstNodeUniop {
AstFEof(FileLine* fl, AstNode* lhsp) : AstNodeUniop(fl, lhsp) {}
ASTNODE_NODE_FUNCS(FEof, FEOF)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { V3ERROR_NA; }
virtual string emitVerilog() { return "%k$feof(%l)"; }
virtual string emitVerilog() { return "%f$feof(%l)"; }
virtual string emitC() { return "(%li ? feof(VL_CVT_Q_FP(%li)) : true)"; }
virtual bool cleanOut() {return true;} virtual bool cleanLhs() {return true;}
virtual bool sizeMattersLhs() {return false;}
@ -2392,7 +2388,7 @@ struct AstFGetC : public AstNodeUniop {
AstFGetC(FileLine* fl, AstNode* lhsp) : AstNodeUniop(fl, lhsp) {}
ASTNODE_NODE_FUNCS(FGetC, FGETC)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { V3ERROR_NA; }
virtual string emitVerilog() { return "%k$fgetc(%l)"; }
virtual string emitVerilog() { return "%f$fgetc(%l)"; }
// Non-existent filehandle returns EOF
virtual string emitC() { return "(%li ? fgetc(VL_CVT_Q_FP(%li)) : -1)"; }
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return true;}
@ -2409,7 +2405,7 @@ struct AstLogOr : public AstNodeBiComAsv {
width(1,1); }
ASTNODE_NODE_FUNCS(LogOr, LOGOR)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogOr(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k|| %r)"; }
virtual string emitVerilog() { return "%k(%l %f|| %r)"; }
virtual string emitC() { return "VL_LOGOR_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "||"; }
virtual bool cleanOut() {return true;}
@ -2422,7 +2418,7 @@ struct AstLogAnd : public AstNodeBiComAsv {
width(1,1); }
ASTNODE_NODE_FUNCS(LogAnd, LOGAND)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogAnd(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k&& %r)"; }
virtual string emitVerilog() { return "%k(%l %f&& %r)"; }
virtual string emitC() { return "VL_LOGAND_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "&&"; }
virtual bool cleanOut() {return true;}
@ -2435,7 +2431,7 @@ struct AstLogIf : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(LogIf, LOGIF)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { V3ERROR_NA; }
virtual string emitVerilog() { return "%k(%l %k-> %r)"; }
virtual string emitVerilog() { return "%k(%l %f-> %r)"; }
virtual string emitC() { return "VL_LOGIF_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "->"; }
virtual bool cleanOut() {return true;}
@ -2448,7 +2444,7 @@ struct AstLogIff : public AstNodeBiCom {
width(1,1); }
ASTNODE_NODE_FUNCS(LogIff, LOGIFF)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { V3ERROR_NA; }
virtual string emitVerilog() { return "%k(%l %k<-> %r)"; }
virtual string emitVerilog() { return "%k(%l %f<-> %r)"; }
virtual string emitC() { return "VL_LOGIFF_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "<->"; }
virtual bool cleanOut() {return true;}
@ -2461,7 +2457,7 @@ struct AstOr : public AstNodeBiComAsv {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(Or, OR)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opOr(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k| %r)"; }
virtual string emitVerilog() { return "%k(%l %f| %r)"; }
virtual string emitC() { return "VL_OR_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "|"; }
virtual bool cleanOut() {V3ERROR_NA; return false;} // Lclean && Rclean
@ -2473,7 +2469,7 @@ struct AstAnd : public AstNodeBiComAsv {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(And, AND)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opAnd(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k& %r)"; }
virtual string emitVerilog() { return "%k(%l %f& %r)"; }
virtual string emitC() { return "VL_AND_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "&"; }
virtual bool cleanOut() {V3ERROR_NA; return false;} // Lclean || Rclean
@ -2485,7 +2481,7 @@ struct AstXor : public AstNodeBiComAsv {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(Xor, XOR)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opXor(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k^ %r)"; }
virtual string emitVerilog() { return "%k(%l %f^ %r)"; }
virtual string emitC() { return "VL_XOR_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "^"; }
virtual bool cleanOut() {return false;} // Lclean && Rclean
@ -2497,7 +2493,7 @@ struct AstXnor : public AstNodeBiComAsv {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(Xnor, XNOR)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opXnor(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k^ ~ %r)"; }
virtual string emitVerilog() { return "%k(%l %f^ ~ %r)"; }
virtual string emitC() { return "VL_XNOR_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "^ ~"; }
virtual bool cleanOut() {return false;}
@ -2509,7 +2505,7 @@ struct AstEq : public AstNodeBiCom {
width(1,1); }
ASTNODE_NODE_FUNCS(Eq, EQ)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opEq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k== %r)"; }
virtual string emitVerilog() { return "%k(%l %f== %r)"; }
virtual string emitC() { return "VL_EQ_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "=="; }
virtual bool cleanOut() {return true;}
@ -2521,7 +2517,7 @@ struct AstNeq : public AstNodeBiCom {
width(1,1); }
ASTNODE_NODE_FUNCS(Neq, NEQ)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opNeq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k!= %r)"; }
virtual string emitVerilog() { return "%k(%l %f!= %r)"; }
virtual string emitC() { return "VL_NEQ_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "!="; }
virtual bool cleanOut() {return true;}
@ -2533,7 +2529,7 @@ struct AstLt : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(Lt, LT)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLt(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k< %r)"; }
virtual string emitVerilog() { return "%k(%l %f< %r)"; }
virtual string emitC() { return "VL_LT_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "<"; }
virtual bool cleanOut() {return true;}
@ -2545,7 +2541,7 @@ struct AstLtS : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(LtS, LTS)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLtS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k< %r)"; }
virtual string emitVerilog() { return "%k(%l %f< %r)"; }
virtual string emitC() { return "VL_LTS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return ""; }
virtual bool cleanOut() {return true;}
@ -2558,7 +2554,7 @@ struct AstGt : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(Gt, GT)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGt(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k> %r)"; }
virtual string emitVerilog() { return "%k(%l %f> %r)"; }
virtual string emitC() { return "VL_GT_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return ">"; }
virtual bool cleanOut() {return true;}
@ -2570,7 +2566,7 @@ struct AstGtS : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(GtS, GTS)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGtS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k> %r)"; }
virtual string emitVerilog() { return "%k(%l %f> %r)"; }
virtual string emitC() { return "VL_GTS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return ""; }
virtual bool cleanOut() {return true;}
@ -2583,7 +2579,7 @@ struct AstGte : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(Gte, GTE)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGte(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k>= %r)"; }
virtual string emitVerilog() { return "%k(%l %f>= %r)"; }
virtual string emitC() { return "VL_GTE_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return ">="; }
virtual bool cleanOut() {return true;}
@ -2595,7 +2591,7 @@ struct AstGteS : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(GteS, GTES)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGteS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k>= %r)"; }
virtual string emitVerilog() { return "%k(%l %f>= %r)"; }
virtual string emitC() { return "VL_GTES_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return ""; }
virtual bool cleanOut() {return true;}
@ -2608,7 +2604,7 @@ struct AstLte : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(Lte, LTE)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLte(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k<= %r)"; }
virtual string emitVerilog() { return "%k(%l %f<= %r)"; }
virtual string emitC() { return "VL_LTE_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "<="; }
virtual bool cleanOut() {return true;}
@ -2620,7 +2616,7 @@ struct AstLteS : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(LteS, LTES)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLteS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k<= %r)"; }
virtual string emitVerilog() { return "%k(%l %f<= %r)"; }
virtual string emitC() { return "VL_LTES_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return ""; }
virtual bool cleanOut() {return true;}
@ -2635,7 +2631,7 @@ struct AstShiftL : public AstNodeBiop {
}
ASTNODE_NODE_FUNCS(ShiftL, SHIFTL)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opShiftL(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k<< %r)"; }
virtual string emitVerilog() { return "%k(%l %f<< %r)"; }
virtual string emitC() { return "VL_SHIFTL_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "<<"; }
virtual bool cleanOut() {return false;}
@ -2649,7 +2645,7 @@ struct AstShiftR : public AstNodeBiop {
}
ASTNODE_NODE_FUNCS(ShiftR, SHIFTR)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opShiftR(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k>> %r)"; }
virtual string emitVerilog() { return "%k(%l %f>> %r)"; }
virtual string emitC() { return "VL_SHIFTR_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return ">>"; }
virtual bool cleanOut() {return false;}
@ -2663,7 +2659,7 @@ struct AstShiftRS : public AstNodeBiop {
}
ASTNODE_NODE_FUNCS(ShiftRS, SHIFTRS)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opShiftRS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k>>> %r)"; }
virtual string emitVerilog() { return "%k(%l %f>>> %r)"; }
virtual string emitC() { return "VL_SHIFTRS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return ""; }
virtual bool cleanOut() {return false;}
@ -2676,7 +2672,7 @@ struct AstAdd : public AstNodeBiComAsv {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(Add, ADD)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opAdd(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k+ %r)"; }
virtual string emitVerilog() { return "%k(%l %f+ %r)"; }
virtual string emitC() { return "VL_ADD_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "+"; }
virtual bool cleanOut() {return false;}
@ -2688,7 +2684,7 @@ struct AstSub : public AstNodeBiop {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(Sub, SUB)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opSub(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k- %r)"; }
virtual string emitVerilog() { return "%k(%l %f- %r)"; }
virtual string emitC() { return "VL_SUB_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "-"; }
virtual bool cleanOut() {return false;}
@ -2700,7 +2696,7 @@ struct AstMul : public AstNodeBiComAsv {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(Mul, MUL)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opMul(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k* %r)"; }
virtual string emitVerilog() { return "%k(%l %f* %r)"; }
virtual string emitC() { return "VL_MUL_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "*"; }
virtual bool cleanOut() {return false;}
@ -2713,7 +2709,7 @@ struct AstMulS : public AstNodeBiComAsv {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(MulS, MULS)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opMulS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k* %r)"; }
virtual string emitVerilog() { return "%k(%l %f* %r)"; }
virtual string emitC() { return "VL_MULS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return ""; }
virtual bool cleanOut() {return false;}
@ -2727,7 +2723,7 @@ struct AstDiv : public AstNodeBiop {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(Div, DIV)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opDiv(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k/ %r)"; }
virtual string emitVerilog() { return "%k(%l %f/ %r)"; }
virtual string emitC() { return "VL_DIV_%nq%lq%rq(%lw, %P, %li, %ri)"; }
virtual bool cleanOut() {return false;}
virtual bool cleanLhs() {return true;} virtual bool cleanRhs() {return true;}
@ -2739,7 +2735,7 @@ struct AstDivS : public AstNodeBiop {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(DivS, DIVS)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opDivS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k/ %r)"; }
virtual string emitVerilog() { return "%k(%l %f/ %r)"; }
virtual string emitC() { return "VL_DIVS_%nq%lq%rq(%lw, %P, %li, %ri)"; }
virtual bool cleanOut() {return false;}
virtual bool cleanLhs() {return true;} virtual bool cleanRhs() {return true;}
@ -2752,7 +2748,7 @@ struct AstModDiv : public AstNodeBiop {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(ModDiv, MODDIV)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opModDiv(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k%% %r)"; }
virtual string emitVerilog() { return "%k(%l %f%% %r)"; }
virtual string emitC() { return "VL_MODDIV_%nq%lq%rq(%lw, %P, %li, %ri)"; }
virtual bool cleanOut() {return false;}
virtual bool cleanLhs() {return true;} virtual bool cleanRhs() {return true;}
@ -2764,7 +2760,7 @@ struct AstModDivS : public AstNodeBiop {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(ModDivS, MODDIVS)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opModDivS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k%% %r)"; }
virtual string emitVerilog() { return "%k(%l %f%% %r)"; }
virtual string emitC() { return "VL_MODDIVS_%nq%lq%rq(%lw, %P, %li, %ri)"; }
virtual bool cleanOut() {return false;}
virtual bool cleanLhs() {return true;} virtual bool cleanRhs() {return true;}
@ -2777,7 +2773,7 @@ struct AstPow : public AstNodeBiop {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(Pow, POW)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPow(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k** %r)"; }
virtual string emitVerilog() { return "%k(%l %f** %r)"; }
virtual string emitC() { return "VL_POW_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual bool cleanOut() {return false;}
virtual bool cleanLhs() {return true;} virtual bool cleanRhs() {return true;}
@ -2789,7 +2785,7 @@ struct AstPowS : public AstNodeBiop {
if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(PowS, POWS)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPowS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k** %r)"; }
virtual string emitVerilog() { return "%k(%l %f** %r)"; }
virtual string emitC() { return "VL_POWS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual bool cleanOut() {return false;}
virtual bool cleanLhs() {return true;} virtual bool cleanRhs() {return true;}
@ -2802,7 +2798,7 @@ struct AstEqCase : public AstNodeBiCom {
width(1,1); }
ASTNODE_NODE_FUNCS(EqCase, EQCASE)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opCaseEq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k=== %r)"; }
virtual string emitVerilog() { return "%k(%l %f=== %r)"; }
virtual string emitC() { return "VL_EQ_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "=="; }
virtual bool cleanOut() {return true;}
@ -2814,7 +2810,7 @@ struct AstNeqCase : public AstNodeBiCom {
width(1,1); }
ASTNODE_NODE_FUNCS(NeqCase, NEQCASE)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opCaseNeq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k!== %r)"; }
virtual string emitVerilog() { return "%k(%l %f!== %r)"; }
virtual string emitC() { return "VL_NEQ_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "!="; }
virtual bool cleanOut() {return true;}
@ -2827,7 +2823,7 @@ struct AstEqWild : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(EqWild, EQWILD)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opWildEq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k==? %r)"; }
virtual string emitVerilog() { return "%k(%l %f==? %r)"; }
virtual string emitC() { return "VL_EQ_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "=="; }
virtual bool cleanOut() {return true;}
@ -2839,7 +2835,7 @@ struct AstNeqWild : public AstNodeBiop {
width(1,1); }
ASTNODE_NODE_FUNCS(NeqWild, NEQWILD)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opWildNeq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %k!=? %r)"; }
virtual string emitVerilog() { return "%k(%l %f!=? %r)"; }
virtual string emitC() { return "VL_NEQ_%lq(%lW, %P, %li, %ri)"; }
virtual string emitSimpleOperator() { return "!="; }
virtual bool cleanOut() {return true;}
@ -2852,7 +2848,7 @@ struct AstConcat : public AstNodeBiop {
if (lhsp->width() && rhsp->width()) width(lhsp->width()+rhsp->width(),lhsp->width()+rhsp->width());
}
ASTNODE_NODE_FUNCS(Concat, CONCAT)
virtual string emitVerilog() { return "%k{%l, %k%r}"; }
virtual string emitVerilog() { return "%f{%l, %k%r}"; }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opConcat(lhs,rhs); }
virtual string emitC() { return "VL_CONCAT_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual bool cleanOut() {return true;}
@ -2866,7 +2862,7 @@ struct AstReplicate : public AstNodeBiop {
: AstNodeBiop(fl, lhsp, new AstConst(fl, repCount)) {}
ASTNODE_NODE_FUNCS(Replicate, REPLICATE)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opRepl(lhs,rhs); }
virtual string emitVerilog() { return "%k{%l{%k%r}}"; }
virtual string emitVerilog() { return "%f{%l{%k%r}}"; }
virtual string emitC() { return "VL_REPLICATE_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
virtual bool cleanOut() {return false;}
virtual bool cleanLhs() {return true;} virtual bool cleanRhs() {return true;}
@ -2877,7 +2873,7 @@ struct AstFGetS : public AstNodeBiop {
AstFGetS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {}
ASTNODE_NODE_FUNCS(FGetS, FGETS)
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { V3ERROR_NA; }
virtual string emitVerilog() { return "%k$fgets(%l,%r)"; }
virtual string emitVerilog() { return "%f$fgets(%l,%r)"; }
virtual string emitC() { return "VL_FGETS_%nqX%rq(%lw, %P, &(%li), %ri)"; }
virtual bool cleanOut() {return false;}
virtual bool cleanLhs() {return true;} virtual bool cleanRhs() {return true;}

View File

@ -39,6 +39,7 @@
class EmitVBaseVisitor : public EmitCBaseVisitor {
// MEMBERS
bool m_suppressSemi;
AstSenTree* m_sensesp;
// METHODS
static int debug() {
@ -49,25 +50,34 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
virtual void puts(const string& str) = 0;
virtual void putbs(const string& str) = 0;
virtual void putfs(AstNode* nodep, const string& str) = 0;
virtual void putsNoTracking(const string& str) = 0;
virtual void putsQuoted(const string& str) {
// Quote \ and " for use inside C programs
// Don't use to quote a filename for #include - #include doesn't \ escape.
// Duplicate in V3File - here so we can print to string
putsNoTracking("\"");
putsNoTracking(AstNode::quoteName(str));
putsNoTracking("\"");
}
// VISITORS
virtual void visit(AstNetlist* nodep, AstNUser*) {
nodep->iterateChildren(*this);
}
virtual void visit(AstModule* nodep, AstNUser*) {
putbs("module "+modClassName(nodep)+";\n");
putfs(nodep, "module "+modClassName(nodep)+";\n");
nodep->iterateChildren(*this);
puts("endmodule\n");
putfs(nodep, "endmodule\n");
}
virtual void visit(AstNodeFTask* nodep, AstNUser*) {
putbs(nodep->isFunction() ? "function":"task");
putfs(nodep, nodep->isFunction() ? "function":"task");
puts(" ");
puts(nodep->name());
puts(";\n");
putbs("begin\n");
putfs(nodep, "begin\n");
nodep->stmtsp()->iterateAndNext(*this);
puts("end\n");
putfs(nodep, "end\n");
}
virtual void visit(AstBegin* nodep, AstNUser*) {
@ -76,48 +86,49 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
puts("end\n");
}
virtual void visit(AstGenerate* nodep, AstNUser*) {
putbs("generate\n");
putfs(nodep, "generate\n");
nodep->iterateChildren(*this);
puts("end\n");
putfs(nodep, "end\n");
}
virtual void visit(AstFinal* nodep, AstNUser*) {
putbs("final begin\n");
putfs(nodep, "final begin\n");
nodep->iterateChildren(*this);
puts("end\n");
putfs(nodep, "end\n");
}
virtual void visit(AstInitial* nodep, AstNUser*) {
putbs("initial begin\n");
putfs(nodep,"initial begin\n");
nodep->iterateChildren(*this);
puts("end\n");
putfs(nodep, "end\n");
}
virtual void visit(AstAlways* nodep, AstNUser*) {
putbs("always ");
nodep->sensesp()->iterateAndNext(*this);
putfs(nodep,"always ");
if (m_sensesp) m_sensesp->iterateAndNext(*this); // In active
else nodep->sensesp()->iterateAndNext(*this);
putbs(" begin\n");
nodep->bodysp()->iterateAndNext(*this);
puts("end\n");
putfs(nodep,"end\n");
}
virtual void visit(AstNodeAssign* nodep, AstNUser*) {
nodep->lhsp()->iterateAndNext(*this);
putbs(" "+nodep->verilogKwd()+" ");
putfs(nodep," "+nodep->verilogKwd()+" ");
nodep->rhsp()->iterateAndNext(*this);
if (!m_suppressSemi) puts(";\n");
}
virtual void visit(AstAssignDly* nodep, AstNUser*) {
nodep->lhsp()->iterateAndNext(*this);
putbs(" <= ");
putfs(nodep," <= ");
nodep->rhsp()->iterateAndNext(*this);
puts(";\n");
}
virtual void visit(AstAssignAlias* nodep, AstNUser*) {
putbs("alias ");
nodep->lhsp()->iterateAndNext(*this);
putbs(" = ");
putfs(nodep," = ");
nodep->rhsp()->iterateAndNext(*this);
if (!m_suppressSemi) puts(";\n");
}
virtual void visit(AstAssignW* nodep, AstNUser*) {
putbs("assign ");
putfs(nodep,"assign ");
nodep->lhsp()->iterateAndNext(*this);
putbs(" = ");
nodep->rhsp()->iterateAndNext(*this);
@ -125,10 +136,10 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
}
virtual void visit(AstSenTree* nodep, AstNUser*) {
// AstSenItem is called for dumping in isolation by V3Order
putbs("@(");
putfs(nodep,"@(");
for (AstNode* expp=nodep->sensesp(); expp; expp = expp->nextp()) {
expp->accept(*this);
if (expp->nextp()) puts(" or ");
if (expp->nextp()) putfs(expp->nextp()," or ");
}
puts(")");
}
@ -136,13 +147,13 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
emitVerilogFormat(nodep, nodep->emitVerilog(), nodep->sensesp(), nodep->rhsp());
}
virtual void visit(AstSenItem* nodep, AstNUser*) {
putbs("");
putfs(nodep,"");
puts(nodep->edgeType().verilogKwd());
if (nodep->sensp()) puts(" ");
nodep->iterateChildren(*this);
}
virtual void visit(AstNodeCase* nodep, AstNUser*) {
putbs(nodep->verilogKwd());
putfs(nodep,nodep->verilogKwd());
puts(" (");
nodep->exprp()->iterateAndNext(*this);
puts(")\n");
@ -154,16 +165,15 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
}
}
nodep->itemsp()->iterateAndNext(*this);
putbs("endcase");
puts("\n");
putfs(nodep,"endcase\n");
}
virtual void visit(AstCaseItem* nodep, AstNUser*) {
if (nodep->condsp()) {
nodep->condsp()->iterateAndNext(*this);
} else putbs("default");
putbs(": begin ");
putfs(nodep,": begin ");
nodep->bodysp()->iterateAndNext(*this);
puts("end\n");
putfs(nodep,"end\n");
}
virtual void visit(AstComment* nodep, AstNUser*) {
puts((string)"// "+nodep->name()+"\n");
@ -174,12 +184,10 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
virtual void visit(AstCoverToggle*, AstNUser*) {} // N/A
void visitNodeDisplay(AstNode* nodep, AstNode* fileOrStrgp, const string& text, AstNode* exprsp) {
putbs(nodep->verilogKwd());
putfs(nodep,nodep->verilogKwd());
putbs(" (");
if (fileOrStrgp) { fileOrStrgp->iterateAndNext(*this); putbs(","); }
puts("\"");
putsNoTracking(text); // Not putsQuoted, as display text contains \ already
puts("\"");
putsQuoted(text);
for (AstNode* expp=exprsp; expp; expp = expp->nextp()) {
puts(",");
expp->iterateAndNext(*this);
@ -203,7 +211,7 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
}
virtual void visit(AstFOpen* nodep, AstNUser*) {
putbs(nodep->verilogKwd());
putfs(nodep,nodep->verilogKwd());
putbs(" (");
if (nodep->filep()) nodep->filep()->iterateChildren(*this);
putbs(",");
@ -213,19 +221,19 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
puts(");\n");
}
virtual void visit(AstFClose* nodep, AstNUser*) {
putbs(nodep->verilogKwd());
putfs(nodep,nodep->verilogKwd());
putbs(" (");
if (nodep->filep()) nodep->filep()->iterateChildren(*this);
puts(");\n");
}
virtual void visit(AstFFlush* nodep, AstNUser*) {
putbs(nodep->verilogKwd());
putfs(nodep,nodep->verilogKwd());
putbs(" (");
if (nodep->filep()) nodep->filep()->iterateChildren(*this);
puts(");\n");
}
virtual void visit(AstReadMem* nodep, AstNUser*) {
putbs(nodep->verilogKwd());
putfs(nodep,nodep->verilogKwd());
putbs(" (");
if (nodep->filenamep()) nodep->filenamep()->iterateChildren(*this);
putbs(",");
@ -235,7 +243,7 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
puts(");\n");
}
virtual void visit(AstNodeFor* nodep, AstNUser*) {
puts("for (");
putfs(nodep,"for (");
m_suppressSemi = true;
nodep->initsp()->iterateAndNext(*this);
puts(";");
@ -243,43 +251,43 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
puts(";");
nodep->incsp()->iterateAndNext(*this);
m_suppressSemi = false;
puts(") {\n");
puts(") begin\n");
nodep->bodysp()->iterateAndNext(*this);
puts("}\n");
putfs(nodep,"end\n");
}
virtual void visit(AstRepeat* nodep, AstNUser*) {
puts("repeat (");
putfs(nodep,"repeat (");
nodep->countp()->iterateAndNext(*this);
puts(") {\n");
puts(") begin\n");
nodep->bodysp()->iterateAndNext(*this);
puts("}\n");
putfs(nodep,"end\n");
}
virtual void visit(AstWhile* nodep, AstNUser*) {
nodep->precondsp()->iterateAndNext(*this);
puts("while (");
putfs(nodep,"while (");
nodep->condp()->iterateAndNext(*this);
puts(") {\n");
puts(") begin\n");
nodep->bodysp()->iterateAndNext(*this);
nodep->precondsp()->iterateAndNext(*this); // Need to recompute before next loop
puts("}\n");
putfs(nodep,"end\n");
}
virtual void visit(AstNodeIf* nodep, AstNUser*) {
puts("if (");
putfs(nodep,"if (");
nodep->condp()->iterateAndNext(*this);
puts(") begin\n");
nodep->ifsp()->iterateAndNext(*this);
if (nodep->elsesp()) {
puts("end\n");
puts("else begin\n");
putfs(nodep,"end\n");
putfs(nodep,"else begin\n");
nodep->elsesp()->iterateAndNext(*this);
}
puts("end\n");
putfs(nodep,"end\n");
}
virtual void visit(AstStop*, AstNUser*) {
putbs("$stop;\n");
virtual void visit(AstStop* nodep, AstNUser*) {
putfs(nodep,"$stop;\n");
}
virtual void visit(AstFinish*, AstNUser*) {
putbs("$finish;\n");
virtual void visit(AstFinish* nodep, AstNUser*) {
putfs(nodep,"$finish;\n");
}
virtual void visit(AstText* nodep, AstNUser*) {
putsNoTracking(nodep->text());
@ -287,22 +295,22 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
virtual void visit(AstScopeName* nodep, AstNUser*) {
}
virtual void visit(AstCStmt* nodep, AstNUser*) {
putbs("$_CSTMT(");
putfs(nodep,"$_CSTMT(");
nodep->bodysp()->iterateAndNext(*this);
puts(");\n");
}
virtual void visit(AstCMath* nodep, AstNUser*) {
putbs("$_CMATH(");
putfs(nodep,"$_CMATH(");
nodep->bodysp()->iterateAndNext(*this);
puts(");\n");
}
virtual void visit(AstUCStmt* nodep, AstNUser*) {
putbs("$c(");
putfs(nodep,"$c(");
nodep->bodysp()->iterateAndNext(*this);
puts(");\n");
}
virtual void visit(AstUCFunc* nodep, AstNUser*) {
putbs("$c(");
putfs(nodep,"$c(");
nodep->bodysp()->iterateAndNext(*this); puts(")\n");
}
@ -311,6 +319,7 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
AstNode* lhsp=NULL, AstNode* rhsp=NULL, AstNode* thsp=NULL) {
// Look at emitVerilog() format for term/uni/dual/triops,
// and write out appropriate text.
// %f Potential fileline-if-change and line break
// %l lhsp - if appropriate
// %r rhsp - if appropriate
// %t thsp - if appropriate
@ -326,6 +335,7 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
inPct = false;
switch (*pos) {
case '%': puts("%"); break;
case 'f': putfs(nodep,""); break;
case 'k': putbs(""); break;
case 'l': {
if (!lhsp) { nodep->v3fatalSrc("emitVerilog() references undef node"); }
@ -363,26 +373,36 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
emitVerilogFormat(nodep, nodep->emitVerilog(), nodep->lhsp(), nodep->rhsp(), nodep->thsp());
}
virtual void visit(AstAttrOf* nodep, AstNUser*) {
puts("$_ATTROF(");
putfs(nodep,"$_ATTROF(");
nodep->fromp()->iterateAndNext(*this);
puts(")");
}
virtual void visit(AstNodeCond* nodep, AstNUser*) {
putbs("(");
nodep->condp()->iterateAndNext(*this); putbs(" ? ");
nodep->condp()->iterateAndNext(*this); putfs(nodep," ? ");
nodep->expr1p()->iterateAndNext(*this); putbs(" : ");
nodep->expr2p()->iterateAndNext(*this); puts(")");
}
virtual void visit(AstRange* nodep, AstNUser*) {
puts("[");
nodep->msbEndianedp()->iterateAndNext(*this); puts(":");
nodep->lsbEndianedp()->iterateAndNext(*this); puts("]");
if (nodep->msbp()->castConst() && nodep->lsbp()->castConst()) {
// Looks nicer if we print [1:0] rather than [32'sh1:32sh0]
puts(cvtToStr(nodep->msbEndianedp()->castConst()->toSInt())); puts(":");
puts(cvtToStr(nodep->lsbEndianedp()->castConst()->toSInt())); puts("]");
} else {
nodep->msbEndianedp()->iterateAndNext(*this); puts(":");
nodep->lsbEndianedp()->iterateAndNext(*this); puts("]");
}
}
virtual void visit(AstSel* nodep, AstNUser*) {
nodep->fromp()->iterateAndNext(*this); puts("[");
if (nodep->lsbp()->castConst()) {
if (nodep->widthp()->isOne()) {
nodep->lsbp()->iterateAndNext(*this);
if (nodep->lsbp()->castConst()) {
puts(cvtToStr(nodep->lsbp()->castConst()->toSInt()));
} else {
nodep->lsbp()->iterateAndNext(*this);
}
} else {
puts(cvtToStr(nodep->lsbp()->castConst()->toSInt()
+nodep->widthp()->castConst()->toSInt()
@ -391,36 +411,41 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
puts(cvtToStr(nodep->lsbp()->castConst()->toSInt()));
}
} else {
nodep->lsbp()->iterateAndNext(*this); puts("+:");
nodep->lsbp()->iterateAndNext(*this); putfs(nodep,"+:");
nodep->widthp()->iterateAndNext(*this); puts("]");
}
puts("]");
}
virtual void visit(AstTypedef* nodep, AstNUser*) {
puts("typedef ");
putfs(nodep,"typedef ");
nodep->dtypep()->iterateAndNext(*this); puts(" ");
puts(nodep->name());
puts(";\n");
}
virtual void visit(AstBasicDType* nodep, AstNUser*) {
if (nodep->isSigned()) putfs(nodep,"signed ");
putfs(nodep,nodep->prettyName());
if (nodep->rangep()) { nodep->rangep()->iterateAndNext(*this); puts(" "); }
}
virtual void visit(AstNodeFTaskRef* nodep, AstNUser*) {
if (nodep->dotted()!="") { puts(nodep->dotted()); puts("."); }
puts(nodep->name());
if (nodep->dotted()!="") { putfs(nodep,nodep->dotted()); puts("."); puts(nodep->name()); }
else { putfs(nodep,nodep->name()); }
puts("(");
nodep->pinsp()->iterateAndNext(*this);
puts(")");
}
// Terminals
virtual void visit(AstVarRef* nodep, AstNUser*) {
puts(nodep->hiername());
putfs(nodep,nodep->hiername());
puts(nodep->varp()->name());
}
virtual void visit(AstVarXRef* nodep, AstNUser*) {
puts(nodep->dotted());
putfs(nodep,nodep->dotted());
puts(".");
puts(nodep->varp()->name());
}
virtual void visit(AstConst* nodep, AstNUser*) {
puts(nodep->num().ascii(true,true));
putfs(nodep,nodep->num().ascii(true,true));
}
// Just iterate
@ -431,13 +456,18 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
nodep->iterateChildren(*this);
}
virtual void visit(AstVar* nodep, AstNUser*) {
puts(nodep->verilogKwd());
putfs(nodep,nodep->verilogKwd());
puts(" ");
if (nodep->isSigned()) puts("signed ");
nodep->dtypep()->iterateChildren(*this);
nodep->dtypep()->iterateChildren(*this); puts(" ");
puts(nodep->name());
puts(";\n");
}
virtual void visit(AstActive* nodep, AstNUser*) {
m_sensesp = nodep->sensesp();
nodep->iterateChildren(*this);
m_sensesp = NULL;
}
virtual void visit(AstVarScope*, AstNUser*) {}
virtual void visit(AstNodeText*, AstNUser*) {}
virtual void visit(AstTraceDecl*, AstNUser*) {}
virtual void visit(AstTraceInc*, AstNUser*) {}
@ -448,12 +478,14 @@ class EmitVBaseVisitor : public EmitCBaseVisitor {
virtual void visit(AstNode* nodep, AstNUser*) {
puts((string)"\n???? // "+nodep->prettyTypeName()+"\n");
nodep->iterateChildren(*this);
nodep->v3fatalSrc("Unknown node type reached emitter: "<<nodep->prettyTypeName());
// Not v3fatalSrc so we keep processing
nodep->v3error("Internal: Unknown node type reached emitter: "<<nodep->prettyTypeName());
}
public:
EmitVBaseVisitor() {
m_suppressSemi = false;
m_sensesp = NULL;
}
virtual ~EmitVBaseVisitor() {}
};
@ -466,9 +498,10 @@ class EmitVFileVisitor : public EmitVBaseVisitor {
V3OutFile* m_ofp;
// METHODS
V3OutFile* ofp() const { return m_ofp; }
void puts(const string& str) { ofp()->puts(str); }
void putbs(const string& str) { ofp()->putbs(str); }
void putsNoTracking(const string& str) { ofp()->putsNoTracking(str); }
virtual void puts(const string& str) { ofp()->puts(str); }
virtual void putbs(const string& str) { ofp()->putbs(str); }
virtual void putfs(AstNode*, const string& str) { putbs(str); }
virtual void putsNoTracking(const string& str) { ofp()->putsNoTracking(str); }
public:
EmitVFileVisitor(AstNode* nodep, V3OutFile* ofp) {
@ -485,9 +518,10 @@ class EmitVStreamVisitor : public EmitVBaseVisitor {
// MEMBERS
ostream& m_os;
// METHODS
void puts(const string& str) { m_os<<str; }
void putbs(const string& str) { m_os<<str; }
void putsNoTracking(const string& str) { m_os<<str; }
virtual void puts(const string& str) { m_os<<str; }
virtual void putbs(const string& str) { m_os<<str; }
virtual void putfs(AstNode*, const string& str) { putbs(str); }
virtual void putsNoTracking(const string& str) { m_os<<str; }
public:
EmitVStreamVisitor(AstNode* nodep, ostream& os)

View File

@ -1137,6 +1137,7 @@ void OrderVisitor::processEdgeReport() {
string filename = v3Global.debugFilename("order_edges.txt");
const auto_ptr<ofstream> logp (V3File::new_ofstream(filename));
if (logp->fail()) v3fatalSrc("Can't write "<<filename);
//Testing emitter: V3EmitV::verilogForTree(v3Global.rootp(), *logp);
deque<string> report;