Beispiel #1
0
    virtual void visit(AstVarRef* nodep) {
        if (!m_stmtStackps.empty()) {
            AstVarScope* vscp = nodep->varScopep();
            if (!vscp) nodep->v3fatalSrc("Not linked");
            if (!nodep->varp()->isConst()) {  // Constant lookups can be ignored
                // ---
                // NOTE: Formerly at this location we would avoid
                // splitting or reordering if the variable is public.
                //
                // However, it should be perfectly safe to split an
                // always block containing a public variable.
                // Neither operation should perturb PLI's view of
                // the variable.
                //
                // Former code:
                //
                //   if (nodep->varp()->isSigPublic()) {
                //       // Public signals shouldn't be changed,
                //       // pli code might be messing with them
                //       scoreboardPli(nodep);
                //   }
                // ---

                // Create vertexes for variable
                if (!vscp->user1p()) {
                    SplitVarStdVertex*  vstdp  = new SplitVarStdVertex(&m_graph, vscp);
                    vscp->user1p(vstdp);
                }
                SplitVarStdVertex*  vstdp  = (SplitVarStdVertex*) vscp->user1p();

                // SPEEDUP: We add duplicate edges, that should be fixed
                if (m_inDly && nodep->lvalue()) {
                    UINFO(4,"     VARREFDLY: "<<nodep<<endl);
                    // Delayed variable is different from non-delayed variable
                    if (!vscp->user2p()) {
                        SplitVarPostVertex* vpostp = new SplitVarPostVertex(&m_graph, vscp);
                        vscp->user2p(vpostp);
                        new SplitPostEdge(&m_graph, vstdp, vpostp);
                    }
                    SplitVarPostVertex* vpostp = (SplitVarPostVertex*)vscp->user2p();
                    // Add edges
                    for (VStack::iterator it = m_stmtStackps.begin(); it != m_stmtStackps.end(); ++it) {
                        new SplitLVEdge(&m_graph, vpostp, *it);
                    }
                } else {  // Nondelayed assignment
                    if (nodep->lvalue()) {
                        // Non-delay; need to maintain existing ordering with all consumers of the signal
                        UINFO(4,"     VARREFLV: "<<nodep<<endl);
                        for (VStack::iterator it = m_stmtStackps.begin(); it != m_stmtStackps.end(); ++it) {
                            new SplitLVEdge(&m_graph, vstdp, *it);
                        }
                    } else {
                        UINFO(4,"     VARREF:   "<<nodep<<endl);
                        makeRvalueEdges(vstdp);
                    }
                }
            }
        }
    }
Beispiel #2
0
 //--------------------
 // Default
 virtual void visit(AstNode* nodep) {
     // **** SPECIAL default type that sets PLI_ORDERING
     if (!m_stmtStackps.empty() && !nodep->isPure()) {
         UINFO(9,"         NotSplittable "<<nodep<<endl);
         scoreboardPli(nodep);
     }
     iterateChildren(nodep);
 }
Beispiel #3
0
    virtual void visit(AstVarRef* nodep, AstNUser*) {
	if (!m_stmtStackps.empty()) {
	    AstVarScope* vscp = nodep->varScopep();
	    if (!vscp) nodep->v3fatalSrc("Not linked");
	    if (!nodep->varp()->isConst()) {  // Constant lookups can be ignored
		if (nodep->varp()->isSigPublic()) {
		    // Public signals shouldn't be changed, pli code might be messing with them
		    scoreboardPli();
		}

		// Create vertexes for variable
		if (!vscp->user1p()) {
		    SplitVarStdVertex*  vstdp  = new SplitVarStdVertex(&m_graph, vscp);
		    vscp->user1p(vstdp);
		}
		SplitVarStdVertex*  vstdp  = (SplitVarStdVertex*) vscp->user1p();

		// SPEEDUP: We add duplicate edges, that should be fixed
		if (m_inDly && nodep->lvalue()) {
		    UINFO(4,"     VARREFDLY: "<<nodep<<endl);
		    // Delayed variable is different from non-delayed variable
		    if (!vscp->user2p()) {
			SplitVarPostVertex* vpostp = new SplitVarPostVertex(&m_graph, vscp);
			vscp->user2p(vpostp);
			new SplitPostEdge(&m_graph, vstdp, vpostp);
		    }
		    SplitVarPostVertex* vpostp = (SplitVarPostVertex*)vscp->user2p();
		    // Add edges
		    for (VStack::iterator it = m_stmtStackps.begin(); it != m_stmtStackps.end(); ++it) {
			new SplitLVEdge(&m_graph, vpostp, *it);
		    }
		} else {  // Nondelayed assignment
		    if (nodep->lvalue()) {
			// Non-delay; need to maintain existing ordering with all consumers of the signal
			UINFO(4,"     VARREFLV: "<<nodep<<endl);
			for (VStack::iterator it = m_stmtStackps.begin(); it != m_stmtStackps.end(); ++it) {
			    new SplitLVEdge(&m_graph, vstdp, *it);
			}
		    } else {
			UINFO(4,"     VARREF:   "<<nodep<<endl);
			for (VStack::iterator it = m_stmtStackps.begin(); it != m_stmtStackps.end(); ++it) {
			    new SplitRVEdge(&m_graph, *it, vstdp);
			}
		    }
		}
	    }
	}
    }
Beispiel #4
0
    void scoreboardPopStmt() {
	//UINFO(9,"    pop"<<endl);
	if (m_stmtStackps.empty()) v3fatalSrc("Stack underflow");
	m_stmtStackps.pop_back();
    }