Internals: Reorder some functions in prep for threads. No functional change.
This commit is contained in:
parent
dddc51b75c
commit
011e9f3b0a
|
|
@ -105,6 +105,8 @@
|
||||||
|
|
||||||
class OrderMoveDomScope;
|
class OrderMoveDomScope;
|
||||||
|
|
||||||
|
static bool domainsExclusive(const AstSenTree* fromp, const AstSenTree* top);
|
||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
// Functions for above graph classes
|
// Functions for above graph classes
|
||||||
|
|
||||||
|
|
@ -371,9 +373,9 @@ public:
|
||||||
virtual ~OrderClkMarkVisitor() {}
|
virtual ~OrderClkMarkVisitor() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
// The class used to check if the assignment has clocker inside.
|
// The class checks if the assignment generates a clock.
|
||||||
|
|
||||||
class OrderClkAssVisitor : public AstNVisitor {
|
class OrderClkAssVisitor : public AstNVisitor {
|
||||||
private:
|
private:
|
||||||
bool m_clkAss; // There is signals marked as clocker in the assignment
|
bool m_clkAss; // There is signals marked as clocker in the assignment
|
||||||
|
|
@ -526,7 +528,6 @@ private:
|
||||||
void processMoveReadyOne(OrderMoveVertex* vertexp);
|
void processMoveReadyOne(OrderMoveVertex* vertexp);
|
||||||
void processMoveDoneOne(OrderMoveVertex* vertexp);
|
void processMoveDoneOne(OrderMoveVertex* vertexp);
|
||||||
void processMoveOne(OrderMoveVertex* vertexp, OrderMoveDomScope* domScopep, int level);
|
void processMoveOne(OrderMoveVertex* vertexp, OrderMoveDomScope* domScopep, int level);
|
||||||
static bool domainsExclusive(const AstSenTree* fromp, const AstSenTree* top);
|
|
||||||
|
|
||||||
string cfuncName(AstNodeModule* modp, AstSenTree* domainp, AstScope* scopep, AstNode* forWhatp) {
|
string cfuncName(AstNodeModule* modp, AstSenTree* domainp, AstScope* scopep, AstNode* forWhatp) {
|
||||||
modp->user3Inc();
|
modp->user3Inc();
|
||||||
|
|
@ -997,7 +998,44 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
// Clock propagation
|
// General utilities
|
||||||
|
|
||||||
|
static bool domainsExclusive(const AstSenTree* fromp, const AstSenTree* top) {
|
||||||
|
// Return 'true' if we can prove that both 'from' and 'to' cannot both
|
||||||
|
// be active on the same eval pass, or false if we can't prove this.
|
||||||
|
//
|
||||||
|
// For now, this only detects the case of 'always @(posedge clk)'
|
||||||
|
// and 'always @(negedge clk)' being exclusive.
|
||||||
|
//
|
||||||
|
// Are there any other cases we need to handle? Maybe not,
|
||||||
|
// because these are not exclusive:
|
||||||
|
// always @(posedge A or posedge B)
|
||||||
|
// always @(negedge A)
|
||||||
|
//
|
||||||
|
// ... unless you know more about A and B, which sounds hard.
|
||||||
|
const AstSenItem* fromSenListp = VN_CAST(fromp->sensesp(), SenItem);
|
||||||
|
const AstSenItem* toSenListp = VN_CAST(top->sensesp(), SenItem);
|
||||||
|
// If clk gating is ever reenabled, we may need to update this to handle
|
||||||
|
// AstSenGate also.
|
||||||
|
if (!fromSenListp) fromp->v3fatalSrc("sensitivity list item is not an AstSenItem");
|
||||||
|
if (!toSenListp) top->v3fatalSrc("sensitivity list item is not an AstSenItem");
|
||||||
|
|
||||||
|
if (fromSenListp->nextp()) return false;
|
||||||
|
if (toSenListp->nextp()) return false;
|
||||||
|
|
||||||
|
const AstNodeVarRef* fromVarrefp = fromSenListp->varrefp();
|
||||||
|
const AstNodeVarRef* toVarrefp = toSenListp->varrefp();
|
||||||
|
if (!fromVarrefp || !toVarrefp) return false;
|
||||||
|
|
||||||
|
// We know nothing about the relationship between different clocks here,
|
||||||
|
// so give up on proving anything.
|
||||||
|
if (fromVarrefp->varScopep() != toVarrefp->varScopep()) return false;
|
||||||
|
|
||||||
|
return fromSenListp->edgeType().exclusiveEdge(toSenListp->edgeType());
|
||||||
|
}
|
||||||
|
|
||||||
|
//######################################################################
|
||||||
|
// OrderVisitor - Clock propagation
|
||||||
|
|
||||||
void OrderVisitor::processInputs() {
|
void OrderVisitor::processInputs() {
|
||||||
m_graph.userClearVertices(); // Vertex::user() // 1 if input recursed, 2 if marked as input, 3 if out-edges recursed
|
m_graph.userClearVertices(); // Vertex::user() // 1 if input recursed, 2 if marked as input, 3 if out-edges recursed
|
||||||
|
|
@ -1076,7 +1114,7 @@ void OrderVisitor::processInputsOutIterate(OrderEitherVertex* vertexp, VertexVec
|
||||||
}
|
}
|
||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
// Circular detection
|
// OrderVisitor - Circular detection
|
||||||
|
|
||||||
void OrderVisitor::processCircular() {
|
void OrderVisitor::processCircular() {
|
||||||
// Take broken edges and add circular flags
|
// Take broken edges and add circular flags
|
||||||
|
|
@ -1245,7 +1283,7 @@ void OrderVisitor::processDomainsIterate(OrderEitherVertex* vertexp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
// Move graph construction
|
// OrderVisitor - Move graph construction
|
||||||
|
|
||||||
void OrderVisitor::processEdgeReport() {
|
void OrderVisitor::processEdgeReport() {
|
||||||
// Make report of all signal names and what clock edges they have
|
// Make report of all signal names and what clock edges they have
|
||||||
|
|
@ -1277,12 +1315,8 @@ void OrderVisitor::processEdgeReport() {
|
||||||
for (std::deque<string>::iterator it=report.begin(); it!=report.end(); ++it) {
|
for (std::deque<string>::iterator it=report.begin(); it!=report.end(); ++it) {
|
||||||
*logp<<(*it)<<endl;
|
*logp<<(*it)<<endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//######################################################################
|
|
||||||
// Move graph construction
|
|
||||||
|
|
||||||
void OrderVisitor::processMoveClear() {
|
void OrderVisitor::processMoveClear() {
|
||||||
OrderMoveDomScope::clear();
|
OrderMoveDomScope::clear();
|
||||||
m_pomWaiting.reset();
|
m_pomWaiting.reset();
|
||||||
|
|
@ -1314,41 +1348,6 @@ void OrderVisitor::processMoveBuildGraph() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OrderVisitor::domainsExclusive(const AstSenTree* fromp,
|
|
||||||
const AstSenTree* top) {
|
|
||||||
// Return 'true' if we can prove that both 'from' and 'to' cannot both
|
|
||||||
// be active on the same eval pass, or false if we can't prove this.
|
|
||||||
//
|
|
||||||
// For now, this only detects the case of 'always @(posedge clk)'
|
|
||||||
// and 'always @(negedge clk)' being exclusive.
|
|
||||||
//
|
|
||||||
// Are there any other cases we need to handle? Maybe not,
|
|
||||||
// because these are not exclusive:
|
|
||||||
// always @(posedge A or posedge B)
|
|
||||||
// always @(negedge A)
|
|
||||||
//
|
|
||||||
// ... unless you know more about A and B, which sounds hard.
|
|
||||||
const AstSenItem* fromSenListp = VN_CAST(fromp->sensesp(), SenItem);
|
|
||||||
const AstSenItem* toSenListp = VN_CAST(top->sensesp(), SenItem);
|
|
||||||
// If clk gating is ever reenabled, we may need to update this to handle
|
|
||||||
// AstSenGate also.
|
|
||||||
if (!fromSenListp) fromp->v3fatalSrc("sensitivity list item is not an AstSenItem");
|
|
||||||
if (!toSenListp) top->v3fatalSrc("sensitivity list item is not an AstSenItem");
|
|
||||||
|
|
||||||
if (fromSenListp->nextp()) return false;
|
|
||||||
if (toSenListp->nextp()) return false;
|
|
||||||
|
|
||||||
const AstNodeVarRef* fromVarrefp = fromSenListp->varrefp();
|
|
||||||
const AstNodeVarRef* toVarrefp = toSenListp->varrefp();
|
|
||||||
if (!fromVarrefp || !toVarrefp) return false;
|
|
||||||
|
|
||||||
// We know nothing about the relationship between different clocks here,
|
|
||||||
// so give up on proving anything.
|
|
||||||
if (fromVarrefp->varScopep() != toVarrefp->varScopep()) return false;
|
|
||||||
|
|
||||||
return fromSenListp->edgeType().exclusiveEdge(toSenListp->edgeType());
|
|
||||||
}
|
|
||||||
|
|
||||||
void OrderVisitor::processMoveBuildGraphIterate (OrderMoveVertex* moveVxp, V3GraphVertex* vertexp, int weightmin) {
|
void OrderVisitor::processMoveBuildGraphIterate (OrderMoveVertex* moveVxp, V3GraphVertex* vertexp, int weightmin) {
|
||||||
// Search forward from given logic vertex, making new edges based on moveVxp
|
// Search forward from given logic vertex, making new edges based on moveVxp
|
||||||
for (V3GraphEdge* edgep = vertexp->outBeginp(); edgep; edgep=edgep->outNextp()) {
|
for (V3GraphEdge* edgep = vertexp->outBeginp(); edgep; edgep=edgep->outNextp()) {
|
||||||
|
|
@ -1388,7 +1387,7 @@ void OrderVisitor::processMoveBuildGraphIterate (OrderMoveVertex* moveVxp, V3Gra
|
||||||
}
|
}
|
||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
// Moving
|
// OrderVisitor - Moving
|
||||||
|
|
||||||
void OrderVisitor::processMove() {
|
void OrderVisitor::processMove() {
|
||||||
// The graph routines have already sorted the vertexes and edges into best->worst order
|
// The graph routines have already sorted the vertexes and edges into best->worst order
|
||||||
|
|
@ -1572,7 +1571,7 @@ inline void OrderMoveDomScope::movedVertex(OrderVisitor* ovp, OrderMoveVertex* v
|
||||||
}
|
}
|
||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
// Top processing
|
// OrderVisitor - Top processing
|
||||||
|
|
||||||
void OrderVisitor::process() {
|
void OrderVisitor::process() {
|
||||||
// Dump data
|
// Dump data
|
||||||
|
|
|
||||||
|
|
@ -330,6 +330,7 @@ public:
|
||||||
virtual OrderMoveVertex* clone(V3Graph* graphp) const {
|
virtual OrderMoveVertex* clone(V3Graph* graphp) const {
|
||||||
return new OrderMoveVertex(graphp, *this);
|
return new OrderMoveVertex(graphp, *this);
|
||||||
}
|
}
|
||||||
|
// METHODS
|
||||||
virtual OrderVEdgeType type() const { return OrderVEdgeType::VERTEX_MOVE; }
|
virtual OrderVEdgeType type() const { return OrderVEdgeType::VERTEX_MOVE; }
|
||||||
virtual string dotColor() const {
|
virtual string dotColor() const {
|
||||||
if (logicp()) {
|
if (logicp()) {
|
||||||
|
|
@ -350,7 +351,6 @@ public:
|
||||||
}
|
}
|
||||||
return nm;
|
return nm;
|
||||||
}
|
}
|
||||||
// ACCESSORS
|
|
||||||
OrderLogicVertex* logicp() const { return m_logicp; }
|
OrderLogicVertex* logicp() const { return m_logicp; }
|
||||||
bool isWait() const { return m_state==POM_WAIT; }
|
bool isWait() const { return m_state==POM_WAIT; }
|
||||||
void setReady() {
|
void setReady() {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue