예제 #1
0
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);
}
예제 #2
0
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;
}
예제 #3
0
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);
}
예제 #4
0
const string
V3NtkHandler::getNetName(const V3NetId& id) const {
   V3NetId netId = id; string name = ""; getNetName(netId, name);
   return name.size() ? ((netId.cp ? V3AuxNameInvPrefix : "") + name) : "";
}
예제 #5
0
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;
}