summaryrefslogtreecommitdiffstats
path: root/src/aig/ntl/ntlCheck.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2008-06-10 08:01:00 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2008-06-10 08:01:00 -0700
commit9d09f583b6ea1181ebd5af1654acd3432c427445 (patch)
tree2ea6fb1cc6f70871f861dd0ccbe7f8522c34c765 /src/aig/ntl/ntlCheck.c
parent9604ecb1745da3bde720cd7be5ee8f89dc6bd5ff (diff)
downloadabc-9d09f583b6ea1181ebd5af1654acd3432c427445.tar.gz
abc-9d09f583b6ea1181ebd5af1654acd3432c427445.tar.bz2
abc-9d09f583b6ea1181ebd5af1654acd3432c427445.zip
Version abc80610
Diffstat (limited to 'src/aig/ntl/ntlCheck.c')
-rw-r--r--src/aig/ntl/ntlCheck.c143
1 files changed, 127 insertions, 16 deletions
diff --git a/src/aig/ntl/ntlCheck.c b/src/aig/ntl/ntlCheck.c
index d5100312..d3aecc8d 100644
--- a/src/aig/ntl/ntlCheck.c
+++ b/src/aig/ntl/ntlCheck.c
@@ -40,11 +40,100 @@
SeeAlso []
***********************************************************************/
-int Ntl_ModelCheck( Ntl_Mod_t * pModel )
+int Ntl_ModelCheck( Ntl_Mod_t * pModel, int fMain )
{
Ntl_Obj_t * pObj;
Ntl_Net_t * pNet;
int i, k, fStatus = 1;
+
+ // check root level model
+ if ( fMain )
+ {
+ if ( Ntl_ModelLatchNum(pModel) > 0 )
+ {
+ printf( "Root level model has %d registers.\n", pModel->pName, Ntl_ModelLatchNum(pModel) );
+ fStatus = 0;
+ }
+ goto checkobjs;
+ }
+
+ // check delay information
+ if ( pModel->attrBox && pModel->attrComb )
+ {
+ if ( pModel->vDelays == NULL )
+ {
+ printf( "Warning: Comb model %s does not have delay info. Default 1.0 delays are assumed.\n", pModel->pName );
+ pModel->vDelays = Vec_IntAlloc( 3 );
+ Vec_IntPush( pModel->vDelays, -1 );
+ Vec_IntPush( pModel->vDelays, -1 );
+ Vec_IntPush( pModel->vDelays, Aig_Float2Int(1.0) );
+ }
+ if ( pModel->vTimeInputs != NULL )
+ {
+ printf( "Combinational model %s has input arrival/required time information.\n", pModel->pName );
+ fStatus = 0;
+ }
+ if ( pModel->vTimeOutputs != NULL )
+ {
+ printf( "Combinational model %s has output arrival/required time information.\n", pModel->pName );
+ fStatus = 0;
+ }
+ }
+ if ( pModel->attrBox && !pModel->attrComb )
+ {
+ if ( pModel->vDelays != NULL )
+ {
+ printf( "Sequential model %s has delay info.\n", pModel->pName );
+ fStatus = 0;
+ }
+ if ( pModel->vTimeInputs == NULL )
+ {
+ printf( "Warning: Seq model %s does not have input arrival/required time info. Default 0.0 is assumed.\n", pModel->pName );
+ pModel->vTimeInputs = Vec_IntAlloc( 2 );
+ Vec_IntPush( pModel->vTimeInputs, -1 );
+ Vec_IntPush( pModel->vTimeInputs, Aig_Float2Int(1.0) );
+ }
+ if ( pModel->vTimeOutputs == NULL )
+ {
+ printf( "Warning: Seq model %s does not have output arrival/required time info. Default 0.0 is assumed.\n", pModel->pName );
+ pModel->vTimeOutputs = Vec_IntAlloc( 2 );
+ Vec_IntPush( pModel->vTimeOutputs, -1 );
+ Vec_IntPush( pModel->vTimeOutputs, Aig_Float2Int(1.0) );
+ }
+ }
+
+ // check box attributes
+ if ( pModel->attrBox )
+ {
+ if ( !pModel->attrWhite )
+ {
+ if ( Ntl_ModelNodeNum(pModel) + Ntl_ModelLut1Num(pModel) > 0 )
+ {
+ printf( "Model %s is a blackbox, yet it has %d nodes.\n", pModel->pName, Ntl_ModelNodeNum(pModel) + Ntl_ModelLut1Num(pModel) );
+ fStatus = 0;
+ }
+ if ( Ntl_ModelLatchNum(pModel) > 0 )
+ {
+ printf( "Model %s is a blackbox, yet it has %d registers.\n", pModel->pName, Ntl_ModelLatchNum(pModel) );
+ fStatus = 0;
+ }
+ return fStatus;
+ }
+ // this is a white box
+ if ( pModel->attrComb && Ntl_ModelNodeNum(pModel) + Ntl_ModelLut1Num(pModel) == 0 )
+ {
+ printf( "Model %s is a comb blackbox, yet it has no nodes.\n", pModel->pName );
+ fStatus = 0;
+ }
+ if ( !pModel->attrComb && Ntl_ModelLatchNum(pModel) == 0 )
+ {
+ printf( "Model %s is a seq blackbox, yet it has no registers.\n", pModel->pName );
+ fStatus = 0;
+ }
+ }
+
+checkobjs:
+ // check nets
Ntl_ModelForEachNet( pModel, pNet, i )
{
if ( pNet->pName == NULL )
@@ -58,6 +147,8 @@ int Ntl_ModelCheck( Ntl_Mod_t * pModel )
fStatus = 0;
}
}
+
+ // check objects
Ntl_ModelForEachObj( pModel, pObj, i )
{
Ntl_ObjForEachFanin( pObj, pNet, k )
@@ -89,8 +180,8 @@ int Ntl_ModelCheck( Ntl_Mod_t * pModel )
***********************************************************************/
int Ntl_ManCheck( Ntl_Man_t * pMan )
{
- Ntl_Mod_t * pMod1, * pMod2;
- int i, k, fStatus = 1;
+ Ntl_Mod_t * pMod1;
+ int i, fStatus = 1;
// check that the models have unique names
Ntl_ManForEachModel( pMan, pMod1, i )
{
@@ -99,16 +190,6 @@ int Ntl_ManCheck( Ntl_Man_t * pMan )
printf( "Model %d does not have a name\n", i );
fStatus = 0;
}
- Ntl_ManForEachModel( pMan, pMod2, k )
- {
- if ( i >= k )
- continue;
- if ( strcmp(pMod1->pName, pMod2->pName) == 0 )
- {
- printf( "Models %d and %d have the same name (%s).\n", i, k, pMod1->pName );
- fStatus = 0;
- }
- }
}
// check that the models (except the first one) do not have boxes
Ntl_ManForEachModel( pMan, pMod1, i )
@@ -124,9 +205,8 @@ int Ntl_ManCheck( Ntl_Man_t * pMan )
// check models
Ntl_ManForEachModel( pMan, pMod1, i )
{
- if ( !Ntl_ModelCheck( pMod1 ) )
+ if ( !Ntl_ModelCheck( pMod1, i==0 ) )
fStatus = 0;
- break;
}
return fStatus;
}
@@ -150,7 +230,7 @@ void Ntl_ModelFixNonDrivenNets( Ntl_Mod_t * pModel )
Ntl_Obj_t * pNode;
int i;
- if ( Ntl_ModelIsBlackBox(pModel) )
+ if ( !pModel->attrWhite )
return;
// check for non-driven nets
@@ -186,6 +266,37 @@ void Ntl_ModelFixNonDrivenNets( Ntl_Mod_t * pModel )
Vec_PtrFree( vNets );
}
+/**Function*************************************************************
+
+ Synopsis [Fixed problems with non-driven nets in the model.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Ntl_ModelTransformLatches( Ntl_Mod_t * pModel )
+{
+ Ntl_Mod_t * pMod[3] = { NULL };
+ Ntl_Obj_t * pLatch;
+ int i, Init;
+ if ( Ntl_ModelLatchNum(pModel) == 0 )
+ return;
+ Ntl_ModelForEachLatch( pModel, pLatch, i )
+ {
+ Init = pLatch->LatchId.regInit;
+ if ( pMod[Init] == NULL )
+ pMod[Init] = Ntl_ManCreateLatchModel( pModel->pMan, Init );
+ pLatch->pImplem = pMod[Init];
+ pLatch->Type = NTL_OBJ_BOX;
+ }
+ printf( "Root level model %s: %d registers turned into white seq boxes.\n", pModel->pName, Ntl_ModelLatchNum(pModel) );
+ pModel->nObjs[NTL_OBJ_BOX] += Ntl_ModelLatchNum(pModel);
+ pModel->nObjs[NTL_OBJ_LATCH] = 0;
+}
+
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///