acbAbc.c 11.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/**CFile****************************************************************

  FileName    [acbAbc.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [Hierarchical word-level netlist.]

  Synopsis    [Bridge.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - July 21, 2015.]

  Revision    [$Id: acbAbc.c,v 1.00 2014/11/29 00:00:00 alanmi Exp $]

***********************************************************************/

#include "acb.h"
#include "base/abc/abc.h"
#include "aig/miniaig/ndr.h"
24
#include "acbPar.h"
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

ABC_NAMESPACE_IMPL_START

////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
///                     FUNCTION DEFINITIONS                         ///
////////////////////////////////////////////////////////////////////////

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
47
Acb_Ntk_t * Acb_NtkFromAbc2( Abc_Ntk_t * p )
48 49 50 51 52 53
{
    Acb_Man_t * pMan = Acb_ManAlloc( Abc_NtkSpec(p), 1, NULL, NULL, NULL, NULL );
    int i, k, NameId = Abc_NamStrFindOrAdd( pMan->pStrs, Abc_NtkName(p), NULL );
    Acb_Ntk_t * pNtk = Acb_NtkAlloc( pMan, NameId, Abc_NtkCiNum(p), Abc_NtkCoNum(p), Abc_NtkObjNum(p) );
    Abc_Obj_t * pObj, * pFanin;
    assert( Abc_NtkIsSopLogic(p) );
54
    pNtk->nFaninMax = 6;
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
    Abc_NtkForEachCi( p, pObj, i )
        pObj->iTemp = Acb_ObjAlloc( pNtk, ABC_OPER_CI, 0, 0 );
    Abc_NtkForEachNode( p, pObj, i )
        pObj->iTemp = Acb_ObjAlloc( pNtk, ABC_OPER_LUT, Abc_ObjFaninNum(pObj), 0 );
    Abc_NtkForEachCo( p, pObj, i )
        pObj->iTemp = Acb_ObjAlloc( pNtk, ABC_OPER_CO, 1, 0 );
    Abc_NtkForEachNode( p, pObj, i )
        Abc_ObjForEachFanin( pObj, pFanin, k )
            Acb_ObjAddFanin( pNtk, pObj->iTemp, pFanin->iTemp );
    Abc_NtkForEachCo( p, pObj, i )
        Acb_ObjAddFanin( pNtk, pObj->iTemp, Abc_ObjFanin(pObj, 0)->iTemp );
    Acb_NtkCleanObjTruths( pNtk );
    Abc_NtkForEachNode( p, pObj, i )
        Acb_ObjSetTruth( pNtk, pObj->iTemp, Abc_SopToTruth((char *)pObj->pData, Abc_ObjFaninNum(pObj)) );
    Acb_NtkSetRegNum( pNtk, Abc_NtkLatchNum(p) );
    Acb_NtkAdd( pMan, pNtk );
    return pNtk;
}
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
Acb_Ntk_t * Acb_NtkFromAbc( Abc_Ntk_t * p )
{
    Acb_Man_t * pMan = Acb_ManAlloc( Abc_NtkSpec(p), 1, NULL, NULL, NULL, NULL );
    int i, k, NameId = Abc_NamStrFindOrAdd( pMan->pStrs, Abc_NtkName(p), NULL );
    Acb_Ntk_t * pNtk = Acb_NtkAlloc( pMan, NameId, Abc_NtkCiNum(p), Abc_NtkCoNum(p), Abc_NtkObjNumMax(p)-1 );
    Abc_Obj_t * pObj, * pFanin;
    assert( Abc_NtkIsSopLogic(p) );
    pNtk->nFaninMax = 6;
    for ( i = 1; i < Abc_NtkObjNumMax(p); i++ )
    {
        pObj = Abc_NtkObj( p, i );
        if ( pObj == NULL )
            Acb_ObjAlloc( pNtk, ABC_OPER_NONE, 0, 0 );
        else if ( Abc_ObjIsCi(pObj) )
            pObj->iTemp = Acb_ObjAlloc( pNtk, ABC_OPER_CI, 0, 0 );
        else if ( Abc_ObjIsCo(pObj) )
            pObj->iTemp = Acb_ObjAlloc( pNtk, ABC_OPER_CO, 1, 0 );
        else if ( Abc_ObjIsNode(pObj) )
            pObj->iTemp = Acb_ObjAlloc( pNtk, ABC_OPER_LUT, Abc_ObjFaninNum(pObj), 0 );
        else assert( 0 );
        assert( pObj == NULL || pObj->iTemp == (int)Abc_ObjId(pObj) );
    }
    Abc_NtkForEachNode( p, pObj, i )
        Abc_ObjForEachFanin( pObj, pFanin, k )
            Acb_ObjAddFanin( pNtk, pObj->iTemp, pFanin->iTemp );
    Abc_NtkForEachCo( p, pObj, i )
        Acb_ObjAddFanin( pNtk, pObj->iTemp, Abc_ObjFanin(pObj, 0)->iTemp );
    Acb_NtkCleanObjTruths( pNtk );
    Abc_NtkForEachNode( p, pObj, i )
        Acb_ObjSetTruth( pNtk, pObj->iTemp, Abc_SopToTruth((char *)pObj->pData, Abc_ObjFaninNum(pObj)) );
    Acb_NtkSetRegNum( pNtk, Abc_NtkLatchNum(p) );
    Acb_NtkAdd( pMan, pNtk );
    return pNtk;
}
107 108 109 110 111 112 113 114 115 116 117 118

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
119 120 121 122 123
Abc_Ntk_t * Acb_NtkToAbc( Abc_Ntk_t * pNtk, Acb_Ntk_t * p )
{
    int i, k, iObj, iFanin;
    Abc_Ntk_t * pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_SOP );
    Mem_Flex_t * pMan = (Mem_Flex_t *)pNtkNew->pManFunc;
124
    Vec_Int_t * vCover = Vec_IntAlloc( 1000 );
125 126 127 128 129 130
    Acb_NtkCleanObjCopies( p );
    Acb_NtkForEachCi( p, iObj, i )
        Acb_ObjSetCopy( p, iObj, Abc_ObjId(Abc_NtkCi(pNtkNew, i)) );
    Acb_NtkForEachNode( p, iObj )
    {
        Abc_Obj_t * pObjNew = Abc_NtkCreateNode( pNtkNew );
131 132 133 134 135 136 137
        pObjNew->pData = Abc_SopCreateFromTruthIsop( pMan, Acb_ObjFaninNum(p, iObj), Acb_ObjTruthP(p, iObj), vCover );
        Acb_ObjSetCopy( p, iObj, Abc_ObjId(pObjNew) );
    }
    Vec_IntFree( vCover );
    Acb_NtkForEachNode( p, iObj )
    {
        Abc_Obj_t * pObjNew = Abc_NtkObj(pNtkNew, Acb_ObjCopy(p, iObj));
138 139
        Acb_ObjForEachFanin( p, iObj, iFanin, k )
            Abc_ObjAddFanin( pObjNew, Abc_NtkObj(pNtkNew, Acb_ObjCopy(p, iFanin)) );
140
        assert( Abc_SopGetVarNum((char *)pObjNew->pData) == Abc_ObjFaninNum(pObjNew) );
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
    }
    Acb_NtkForEachCoDriver( p, iFanin, i )
        Abc_ObjAddFanin( Abc_NtkCo(pNtkNew, i), Abc_NtkObj(pNtkNew, Acb_ObjCopy(p, iFanin)) );
    if ( !Abc_NtkCheck( pNtkNew ) )
    {
        printf( "Acb_NtkToAbc: The network check has failed.\n" );
        Abc_NtkDelete( pNtkNew );
        return NULL;
    }
    return pNtkNew;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
164 165 166 167 168
Acb_Ntk_t * Acb_NtkFromNdr( char * pFileName, void * pModule, Abc_Nam_t * pNames, Vec_Int_t * vWeights, int nNameIdMax )
{
    Ndr_Data_t * p   = (Ndr_Data_t *)pModule; 
    Acb_Man_t * pMan = Acb_ManAlloc( pFileName, 1, Abc_NamRef(pNames), NULL, NULL, NULL );
    int k, NameId = Abc_NamStrFindOrAdd( pMan->pStrs, pMan->pName, NULL );
169
    int Mod = 2, Obj, Type, nArray, * pArray, ObjId;
170
    int Token0 = Abc_NamStrFind( pMan->pStrs, "1\'b0" );
171 172 173 174 175 176 177 178 179 180
    Acb_Ntk_t * pNtk = Acb_NtkAlloc( pMan, NameId, Ndr_DataCiNum(p, Mod), Ndr_DataCoNum(p, Mod), Ndr_DataObjNum(p, Mod) );
    Vec_Int_t * vMap = Vec_IntStart( nNameIdMax );
    Acb_NtkCleanObjWeights( pNtk );
    Acb_NtkCleanObjNames( pNtk );
    Ndr_ModForEachPi( p, Mod, Obj )
    {
        NameId = Ndr_ObjReadBody( p, Obj, NDR_OUTPUT );
        ObjId  = Acb_ObjAlloc( pNtk, ABC_OPER_CI, 0, 0 );
        Vec_IntWriteEntry( vMap, NameId, ObjId );
        Acb_ObjSetName( pNtk, ObjId, NameId );
181
        Acb_ObjSetWeight( pNtk, ObjId, vWeights ? Vec_IntEntry(vWeights, NameId) : 1 );
182 183 184 185 186 187 188 189 190 191 192 193 194 195
    }
    Ndr_ModForEachTarget( p, Mod, Obj )
    {
        NameId = Ndr_DataEntry( p, Obj );
        ObjId  = Acb_ObjAlloc( pNtk, ABC_OPER_CONST_F, 0, 0 );
        Vec_IntWriteEntry( vMap, NameId, ObjId );
        Acb_ObjSetName( pNtk, ObjId, NameId );
        Vec_IntPush( &pNtk->vTargets, ObjId );
    }
    Ndr_ModForEachNode( p, Mod, Obj )
    {
        NameId = Ndr_ObjReadBody( p, Obj, NDR_OUTPUT );
        nArray = Ndr_ObjReadArray( p, Obj, NDR_INPUT, &pArray );
        Type   = Ndr_ObjReadBody( p, Obj, NDR_OPERTYPE );
196
        ObjId  = Acb_ObjAlloc( pNtk, (Acb_ObjType_t) Type, nArray, 0 );
197 198 199 200 201
        Vec_IntWriteEntry( vMap, NameId, ObjId );
        Acb_ObjSetName( pNtk, ObjId, NameId );
    }
    Ndr_ModForEachNode( p, Mod, Obj )
    {
202 203
        int NameId = Ndr_ObjReadBody( p, Obj, NDR_OUTPUT );
        char * pName = Abc_NamStr( pMan->pStrs, NameId );
204 205 206
        ObjId  = Vec_IntEntry( vMap, NameId );
        nArray = Ndr_ObjReadArray( p, Obj, NDR_INPUT, &pArray );
        for ( k = 0; k < nArray; k++ )
207 208 209
        {
            if ( Vec_IntEntry(vMap, pArray[k]) == 0 )
                printf( "Cannot find fanin %d of node \"%s\".\n", k, pName );
210
            Acb_ObjAddFanin( pNtk, ObjId, Vec_IntEntry(vMap, pArray[k]) );
211
        }
212
        Acb_ObjSetWeight( pNtk, ObjId, vWeights ? Vec_IntEntry(vWeights, NameId) : 1 );
213 214 215
    }
    Ndr_ModForEachPo( p, Mod, Obj )
    {
216 217
        int NameId = Ndr_ObjReadBody( p, Obj, NDR_OUTPUT );
        char * pName = Abc_NamStr( pMan->pStrs, NameId );
218 219 220
        nArray = Ndr_ObjReadArray( p, Obj, NDR_INPUT, &pArray );
        assert( nArray == 1 );
        ObjId  = Acb_ObjAlloc( pNtk, ABC_OPER_CO, 1, 0 );
221 222 223 224 225
        if ( Vec_IntEntry(vMap, pArray[0]) == 0 )
        {
            printf( "Adding constant 0 driver to non-driven PO \"%s\".\n", pName );
            Vec_IntWriteEntry( vMap, pArray[0], Token0 );
        }
226 227 228 229 230 231 232 233 234
        Acb_ObjAddFanin( pNtk, ObjId, Vec_IntEntry(vMap, pArray[0]) );
        Acb_ObjSetName( pNtk, ObjId, pArray[0] );
    }
    Vec_IntFree( vMap );
    Acb_NtkSetRegNum( pNtk, 0 );
    Acb_NtkAdd( pMan, pNtk );
    return pNtk;
}

235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
/**Function*************************************************************

  Synopsis    [Setup parameter structure.]

  Description []

  SideEffects []

  SeeAlso     []

***********************************************************************/
void Acb_ParSetDefault( Acb_Par_t * pPars )
{
    memset( pPars, 0, sizeof(Acb_Par_t) );
    pPars->nLutSize     =    4;    // LUT size
250
    pPars->nTfoLevMax   =    2;    // the maximum fanout levels
251
    pPars->nTfiLevMax   =    3;    // the maximum fanin levels
252
    pPars->nFanoutMax   =   20;    // the maximum number of fanouts
253
    pPars->nWinNodeMax  =  100;    // the maximum number of nodes in the window
254 255 256 257
    pPars->nGrowthLevel =    0;    // the maximum allowed growth in level
    pPars->nBTLimit     =    0;    // the maximum number of conflicts in one SAT run
    pPars->nNodesMax    =    0;    // the maximum number of nodes to try
    pPars->iNodeOne     =    0;    // one particular node to try
258
    pPars->fArea        =    1;    // performs optimization for area
259
    pPars->fUseAshen    =    0;    // use Ashenhurst decomposition
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
    pPars->fMoreEffort  =    0;    // enables using more effort
    pPars->fVerbose     =    0;    // enable basic stats
    pPars->fVeryVerbose =    0;    // enable detailed stats
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Abc_Ntk_t * Abc_NtkOptMfse( Abc_Ntk_t * pNtk, Acb_Par_t * pPars )
{
    extern void Acb_NtkOpt( Acb_Ntk_t * p, Acb_Par_t * pPars );
    Abc_Ntk_t * pNtkNew;
    Acb_Ntk_t * p = Acb_NtkFromAbc( pNtk );
281
    Acb_NtkOpt( p, pPars );
282 283 284 285 286
    pNtkNew = Acb_NtkToAbc( pNtk, p );
    Acb_ManFree( p->pDesign );
    return pNtkNew;
}

287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Abc_Ntk_t * Abc_NtkOptPush( Abc_Ntk_t * pNtk, int nLutSize, int fVerbose )
{
    extern void Acb_NtkPushLogic( Acb_Ntk_t * p, int nLutSize, int fVerbose );
    Abc_Ntk_t * pNtkNew;
    Acb_Ntk_t * p = Acb_NtkFromAbc( pNtk );
    Acb_NtkPushLogic( p, nLutSize, fVerbose );
    pNtkNew = Acb_NtkToAbc( pNtk, p );
    Acb_ManFree( p->pDesign );
    return pNtkNew;
}

309 310 311 312 313 314 315
////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


ABC_NAMESPACE_IMPL_END