const string V3NtkHandler::getNetExpression(const V3NetId& id) const { V3NetId netId; string name = ""; // Search for the name of id in Original Network getNetName(netId = id, name); if (name.size()) return (netId.cp ? V3AuxNameInvPrefix : "") + name; // Search for the name of ~id in Original Network getNetName(netId = ~id, name); if (name.size()) return (netId.cp ? "" : V3AuxNameInvPrefix) + name; // Return the Expression in terms of Gate Operations return getNetRecurExpression(id); }
void V3NtkHandler::printNet(const V3NetId& id) const { assert (_ntk); assert (_ntk->getNetSize() > id.id); Msg(MSG_IFO) << "Net : Id = " << (id.cp ? "~" : "") << id.id << ", " << "Width = " << _ntk->getNetWidth(id) << ", " << "Type = " << V3GateTypeStr[_ntk->getGateType(id)] << endl; const V3GateType type = _ntk->getGateType(id); assert (V3_XD > type); V3NetId netId; string name = ""; Msg(MSG_IFO) << "Expr : "; if (!name.size()) { getNetName(netId = id, name); if (name.size()) Msg(MSG_IFO) << (netId.cp ? V3AuxNameInvPrefix : "") + name; } if (!name.size()) { getNetName(netId = ~id, name); if (name.size()) Msg(MSG_IFO) << (netId.cp ? "" : V3AuxNameInvPrefix) + name; } if (V3_FF <= type) { if (name.size()) Msg(MSG_IFO) << " = "; Msg(MSG_IFO) << getNetRecurExpression(V3_FF == type ? _ntk->getInputNetId(id, 0) : id); } Msg(MSG_IFO) << endl; }
const string V3NtkHandler::getNetNameOrFormedWithId(const V3NetId& id) const { const string name = getNetName(id); if (name.size()) return name; return (id.cp ? V3AuxNameInvPrefix : "") + V3AuxNetNamePrefix + v3Int2Str(id.id); }
const string V3NtkHandler::getNetName(const V3NetId& id) const { V3NetId netId = id; string name = ""; getNetName(netId, name); return name.size() ? ((netId.cp ? V3AuxNameInvPrefix : "") + name) : ""; }
const string V3NtkHandler::getNetExpression(const V3NetId& id) const { V3NetId netId; string name = ""; // Search for the name of id in Original Network getNetName(netId = id, name); if (name.size()) return (netId.cp ? V3AuxNameInvPrefix : "") + name; // Search for the name of ~id in Original Network getNetName(netId = ~id, name); if (name.size()) return (netId.cp ? "" : V3AuxNameInvPrefix) + name; // Return the Expression in terms of Gate Operations assert (_ntk); assert (id.id < _ntk->getNetSize()); const V3GateType& type = _ntk->getGateType(id); assert (V3_XD > type); if (V3_FF >= type) return (id.cp ? V3AuxNameInvPrefix : "") + V3AuxNetNamePrefix + v3Int2Str(id.id); else if (V3_MODULE == type) { Msg(MSG_WAR) << "Currently Expression Over Module Instances has NOT Been Implemented !!" << endl; } else { if (dynamic_cast<V3BvNtk*>(_ntk)) { assert (AIG_FALSE < type); if (isV3PairType(type)) { const string name1 = getNetExpression(_ntk->getInputNetId(id, 0)); assert (name1.size()); const string name2 = getNetExpression(_ntk->getInputNetId(id, 1)); assert (name2.size()); if (BV_MERGE == type) name = "{" + name1 + ", " + name2 + "}"; else { switch (type) { case BV_AND : name = "(" + name1 + " & " + name2 + ")"; break; case BV_XOR : name = "(" + name1 + " ^ " + name2 + ")"; break; case BV_ADD : name = "(" + name1 + " + " + name2 + ")"; break; case BV_SUB : name = "(" + name1 + " - " + name2 + ")"; break; case BV_MULT : name = "(" + name1 + " * " + name2 + ")"; break; case BV_SHL : name = "(" + name1 + " << " + name2 + ")"; break; case BV_SHR : name = "(" + name1 + " >> " + name2 + ")"; break; case BV_DIV : name = "(" + name1 + " / " + name2 + ")"; break; case BV_MODULO : name = "(" + name1 + " % " + name2 + ")"; break; case BV_EQUALITY : return "(" + name1 + (id.cp ? " != " : " == ") + name2 + ")"; case BV_GEQ : return "(" + name1 + (id.cp ? " < " : " >= ") + name2 + ")"; default : assert (0); } } } else if (isV3ReducedType(type)) { const string name1 = getNetExpression(_ntk->getInputNetId(id, 0)); assert (name1.size()); switch (type) { case BV_RED_AND : name = "(&" + name1 + ")"; break; case BV_RED_OR : name = "(|" + name1 + ")"; break; case BV_RED_XOR : name = "(^" + name1 + ")"; break; default : assert (0); } } else if (BV_MUX == type) { const string fName = getNetExpression(_ntk->getInputNetId(id, 0)); assert (fName.size()); const string tName = getNetExpression(_ntk->getInputNetId(id, 1)); assert (tName.size()); const string sName = getNetExpression(_ntk->getInputNetId(id, 2)); assert (sName.size()); name = "(" + sName + " ? " + tName + " : " + fName + ")"; } else if (BV_SLICE == type) { const string name1 = getNetExpression(_ntk->getInputNetId(id, 0)); assert (name1.size()); const uint32_t msb = dynamic_cast<V3BvNtk*>(_ntk)->getInputSliceBit(id, true); const uint32_t lsb = dynamic_cast<V3BvNtk*>(_ntk)->getInputSliceBit(id, false); const uint32_t width = _ntk->getNetWidth(_ntk->getInputNetId(id, 0)); assert (width); name = ((msb >= lsb) && (width == (1 + msb - lsb))) ? name1 : (msb == lsb) ? (name1 + "[" + v3Int2Str(msb) + "]") : (name1 + "[" + v3Int2Str(msb) + " : " + v3Int2Str(lsb) + "]"); } else { assert (BV_CONST == type); const V3BitVecX* const value = dynamic_cast<V3BvNtk*>(_ntk)->getInputConstValue(id); assert (value); return v3Int2Str(value->size()) + "'b" + (id.cp ? (~(*value)).regEx() : value->regEx()); } } else { assert (AIG_FALSE >= type); if (AIG_NODE == type) { const string name1 = getNetExpression(_ntk->getInputNetId(id, 0)); assert (name1.size()); const string name2 = getNetExpression(_ntk->getInputNetId(id, 1)); assert (name2.size()); name = name1 + " && " + name2; } else { assert (AIG_FALSE == type); return (id.cp ? "AIGER_TRUE" : "AIGER_FALSE"); } } } return (id.cp ? V3AuxNameInvPrefix : "") + name; }