@@ -199,7 +199,7 @@ class AstNodeReadWriteMem VL_NOT_FINAL : public AstNodeStmt {
199199
200200// === AstNode ===
201201class AstCaseItem final : public AstNode {
202- // Single item of AstCase/AstRandCase/AstRSCase
202+ // Single item of AstCase/AstRandCase
203203 // @astgen op1 := condsp : List[AstNodeExpr]
204204 // @astgen op2 := stmtsp : List[AstNode]
205205public:
@@ -887,42 +887,17 @@ class AstPrintTimeScale final : public AstNodeStmt {
887887 void timeunit (const VTimescale& flag) { m_timeunit = flag; }
888888 VTimescale timeunit () const { return m_timeunit; }
889889};
890- class AstRSCase final : public AstNodeStmt {
891- // Randsequence case statement
892- // @astgen op1 := exprp : AstNodeExpr // Condition (scurtinee) expression
893- // @astgen op2 := itemsp : List[AstCaseItem]
894- public:
895- AstRSCase (FileLine* fl, AstNodeExpr* exprp, AstCaseItem* itemsp)
896- : ASTGEN_SUPER_Case(fl) {
897- this ->exprp (exprp);
898- addItemsp (itemsp);
899- }
900- ASTGEN_MEMBERS_AstRSCase;
901- int instrCount () const override { return INSTR_COUNT_BRANCH; }
902- bool sameNode (const AstNode* samep) const override { return true ; }
903- };
904- class AstRSIf final : public AstNodeStmt {
905- // Randsequence if
906- // @astgen op1 := condp : AstNodeExpr
907- // @astgen op2 := thensp : List[AstNode]
908- // @astgen op3 := elsesp : List[AstNode]
909- public:
910- AstRSIf (FileLine* fl, AstNodeExpr* condp, AstNode* thensp, AstNode* elsesp)
911- : ASTGEN_SUPER_RSIf(fl) {
912- this ->condp (condp);
913- addThensp (thensp);
914- addElsesp (elsesp);
915- }
916-
890+ class AstRSBreak final : public AstNodeStmt {
891+ // randsequence break
917892public:
918- ASTGEN_MEMBERS_AstRSIf;
919- bool isGateOptimizable () const override { return false ; }
920- bool isGateDedupable () const override { return false ; }
921- int instrCount () const override { return INSTR_COUNT_BRANCH ; }
922- bool sameNode ( const AstNode* /* samep */ ) const override { return true ; }
893+ explicit AstRSBreak (FileLine* fl)
894+ : ASTGEN_SUPER_RSBreak(fl) { }
895+ ASTGEN_MEMBERS_AstRSBreak;
896+ string verilogKwd () const override { return " break " ; }
897+ bool isBrancher ( ) const override { V3ERROR_NA_RETURN ( true ) ; } // Node removed early
923898};
924899class AstRSProd final : public AstNodeStmt {
925- // randomsquence production, under a AstRandSequence
900+ // randomsequence production, under a AstRandSequence
926901 // @astgen op1 := fvarp : Optional[AstVar]
927902 // @astgen op2 := portsp : List[AstNode]
928903 // @astgen op3 := rulesp : List[AstRSRule]
@@ -935,12 +910,14 @@ class AstRSProd final : public AstNodeStmt {
935910 addRulesp (rulesp);
936911 }
937912 ASTGEN_MEMBERS_AstRSProd;
913+ bool maybePointedTo () const override VL_MT_SAFE { return true ; }
938914 string name () const override VL_MT_STABLE { return m_name; }
939915 int instrCount () const override { return INSTR_COUNT_BRANCH; }
940916};
941917class AstRSProdItem final : public AstNodeStmt {
942918 // randomsquence production item
943919 // @astgen op1 := argsp : List[AstNodeExpr]
920+ // @astgen ptr := m_prodp : Optional[AstRSProd] // Pointer to production
944921 string m_name; // Name of block, or "" to use first production
945922public:
946923 AstRSProdItem (FileLine* fl, const string& name, AstNodeExpr* argsp)
@@ -951,6 +928,8 @@ class AstRSProdItem final : public AstNodeStmt {
951928 ASTGEN_MEMBERS_AstRSProdItem;
952929 string name () const override VL_MT_STABLE { return m_name; }
953930 int instrCount () const override { return INSTR_COUNT_BRANCH; }
931+ AstRSProd* prodp () const { return m_prodp; }
932+ void prodp (AstRSProd* nodep) { m_prodp = nodep; }
954933};
955934class AstRSProdList final : public AstNodeStmt {
956935 // randomsquence production list
@@ -970,32 +949,26 @@ class AstRSProdList final : public AstNodeStmt {
970949 bool randJoin () const { return m_randJoin; }
971950 void randJoin (bool flag) { m_randJoin = flag; }
972951};
973- class AstRSRepeat final : public AstNodeStmt {
974- // randsequence repeat
975- // @astgen op1 := countp : AstNodeExpr
976- // @astgen op2 := stmtsp : List[AstNode]
952+ class AstRSReturn final : public AstNodeStmt {
953+ // randsequence return
977954public:
978- AstRSRepeat (FileLine* fl, AstNodeExpr* countp, AstNode* stmtsp)
979- : ASTGEN_SUPER_RSRepeat(fl) {
980- this ->countp (countp);
981- addStmtsp (stmtsp);
982- }
983- ASTGEN_MEMBERS_AstRSRepeat;
984- bool isGateOptimizable () const override { return false ; }
985- int instrCount () const override { return INSTR_COUNT_BRANCH; }
986- bool sameNode (const AstNode* /* samep*/ ) const override { return true ; }
955+ explicit AstRSReturn (FileLine* fl)
956+ : ASTGEN_SUPER_RSReturn(fl) {}
957+ ASTGEN_MEMBERS_AstRSReturn;
958+ string verilogKwd () const override { return " return" ; }
959+ bool isBrancher () const override { V3ERROR_NA_RETURN (true ); } // Node removed early
987960};
988961class AstRSRule final : public AstNodeStmt {
989962 // randomsquence rule
990963 // @astgen op1 := weightp : Optional[AstNodeExpr]
991964 // @astgen op2 := prodlistsp : List[AstRSProdList]
992- // @astgen op3 := stmtsp : List[AstNode]
965+ // @astgen op3 := weightStmtsp : List[AstNode]
993966public:
994- AstRSRule (FileLine* fl, AstNodeExpr* weightp, AstRSProdList* prodlistsp, AstNode* stmtsp )
967+ AstRSRule (FileLine* fl, AstNodeExpr* weightp, AstRSProdList* prodlistsp, AstNode* weightStmtsp )
995968 : ASTGEN_SUPER_RSRule(fl) {
996969 this ->weightp (weightp);
997970 addProdlistsp (prodlistsp);
998- addStmtsp (stmtsp );
971+ addWeightStmtsp (weightStmtsp );
999972 }
1000973 ASTGEN_MEMBERS_AstRSRule;
1001974 int instrCount () const override { return INSTR_COUNT_BRANCH; }
@@ -1013,16 +986,24 @@ class AstRandCase final : public AstNodeStmt {
1013986};
1014987class AstRandSequence final : public AstNodeStmt {
1015988 // @astgen op2 := prodsp : List[AstRSProd]
1016- string m_name; // Name of block, or "" to use first production
989+ // @astgen ptr := m_prodp : Optional[AstRSProd] // Pointer to start production (if any)
990+ string m_name; // Created unique name
991+ string m_start; // Name of start production, or "" to use first production
1017992public:
1018- AstRandSequence (FileLine* fl, const string& name , AstRSProd* prodsp)
993+ AstRandSequence (FileLine* fl, const string& start , AstRSProd* prodsp)
1019994 : ASTGEN_SUPER_RandSequence(fl)
1020- , m_name{name } {
995+ , m_start{start } {
1021996 addProdsp (prodsp);
1022997 }
1023998 ASTGEN_MEMBERS_AstRandSequence;
999+ void dump (std::ostream& str) const override ;
1000+ void dumpJson (std::ostream& str) const override ;
10241001 string name () const override VL_MT_STABLE { return m_name; } // * = Block name
1002+ void name (const string& name) override { m_name = name; }
1003+ string start () const VL_MT_STABLE { return m_start; }
10251004 int instrCount () const override { return INSTR_COUNT_BRANCH; }
1005+ AstRSProd* prodp () const { return m_prodp; }
1006+ void prodp (AstRSProd* nodep) { m_prodp = nodep; }
10261007};
10271008class AstRelease final : public AstNodeStmt {
10281009 // Procedural 'release' statement
0 commit comments