virtual void visit(AstNodeIf* nodep) { const ColorSet& colors = m_ifColorp->colors(nodep); typedef vl_unordered_map<uint32_t, AstNodeIf*> CloneMap; CloneMap clones; for (ColorSet::const_iterator color = colors.begin(); color != colors.end(); ++color) { // Clone this if into its set of split blocks AstSplitPlaceholder* if_placeholderp = makePlaceholderp(); AstSplitPlaceholder* else_placeholderp = makePlaceholderp(); AstIf* clonep = new AstIf(nodep->fileline(), nodep->condp()->cloneTree(true), if_placeholderp, else_placeholderp); AstIf* origp = VN_CAST(nodep, If); if (origp) { // Preserve pragmas from unique if's // so assertions work properly clonep->uniquePragma(origp->uniquePragma()); clonep->unique0Pragma(origp->unique0Pragma()); clonep->priorityPragma(origp->priorityPragma()); } clones[*color] = clonep; m_addAfter[*color]->addNextHere(clonep); m_addAfter[*color] = if_placeholderp; } iterateAndNextNull(nodep->ifsp()); for (ColorSet::const_iterator color = colors.begin(); color != colors.end(); ++color) { m_addAfter[*color] = clones[*color]->elsesp(); } iterateAndNextNull(nodep->elsesp()); for (ColorSet::const_iterator color = colors.begin(); color != colors.end(); ++color) { m_addAfter[*color] = clones[*color]; } }