Internals: Cleanup V3EmitV to allow filename prefixing
This commit is contained in:
parent
f3347be629
commit
be6454193b
|
|
@ -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 {
|
||||
|
|
|
|||
128
src/V3AstNodes.h
128
src/V3AstNodes.h
|
|
@ -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;}
|
||||
|
|
|
|||
188
src/V3EmitV.cpp
188
src/V3EmitV.cpp
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue