ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
darCut.c File Reference
#include "darInt.h"
Include dependency graph for darCut.c:

Go to the source code of this file.

Functions

ABC_NAMESPACE_IMPL_START void Dar_CutPrint (Dar_Cut_t *pCut)
 DECLARATIONS ///.
 
void Dar_ObjCutPrint (Aig_Man_t *p, Aig_Obj_t *pObj)
 
unsigned Dar_CutSortVars (unsigned uTruth, int *pVars)
 
void Dar_ManCutsFree (Dar_Man_t *p)
 
Dar_Cut_tDar_ObjPrepareCuts (Dar_Man_t *p, Aig_Obj_t *pObj)
 
void Dar_ManCutsRestart (Dar_Man_t *p, Aig_Obj_t *pRoot)
 FUNCTION DECLARATIONS ///.
 
Dar_Cut_tDar_ObjComputeCuts (Dar_Man_t *p, Aig_Obj_t *pObj, int fSkipTtMin)
 
Dar_Cut_tDar_ObjComputeCuts_rec (Dar_Man_t *p, Aig_Obj_t *pObj)
 

Function Documentation

◆ Dar_CutPrint()

ABC_NAMESPACE_IMPL_START void Dar_CutPrint ( Dar_Cut_t * pCut)

DECLARATIONS ///.

CFile****************************************************************

FileName [darCut.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [DAG-aware AIG rewriting.]

Synopsis [Computation of 4-input cuts.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

Date [Ver. 1.0. Started - April 28, 2007.]

Revision [

Id
darCut.c,v 1.00 2007/04/28 00:00:00 alanmi Exp

] FUNCTION DEFINITIONS /// Function*************************************************************

Synopsis [Prints one cut.]

Description []

SideEffects []

SeeAlso []

Definition at line 45 of file darCut.c.

46{
47 unsigned i;
48 printf( "{" );
49 for ( i = 0; i < pCut->nLeaves; i++ )
50 printf( " %d", pCut->pLeaves[i] );
51 printf( " }\n" );
52}
unsigned nLeaves
Definition darInt.h:62
int pLeaves[4]
Definition darInt.h:63
Here is the caller graph for this function:

◆ Dar_CutSortVars()

unsigned Dar_CutSortVars ( unsigned uTruth,
int * pVars )

Function*************************************************************

Synopsis [Sort variables by their ID.]

Description []

SideEffects []

SeeAlso []

Definition at line 521 of file darCut.c.

522{
523 int i, Temp, fChange, Counter = 0;
524 // replace -1 by large number
525 for ( i = 0; i < 4; i++ )
526 {
527 if ( pVars[i] == -1 )
528 pVars[i] = 0x3FFFFFFF;
529 else
530 if ( Abc_LitIsCompl(pVars[i]) )
531 {
532 pVars[i] = Abc_LitNot( pVars[i] );
533 uTruth = Dar_CutTruthSwapPolarity( uTruth, i );
534 }
535 }
536
537 // permute variables
538 do {
539 fChange = 0;
540 for ( i = 0; i < 3; i++ )
541 {
542 if ( pVars[i] <= pVars[i+1] )
543 continue;
544 Counter++;
545 fChange = 1;
546
547 Temp = pVars[i];
548 pVars[i] = pVars[i+1];
549 pVars[i+1] = Temp;
550
551 uTruth = Dar_CutTruthSwapAdjacentVars( uTruth, i );
552 }
553 } while ( fChange );
554
555 // replace large number by -1
556 for ( i = 0; i < 4; i++ )
557 {
558 if ( pVars[i] == 0x3FFFFFFF )
559 pVars[i] = -1;
560// printf( "%d ", pVars[i] );
561 }
562// printf( "\n" );
563
564 return uTruth;
565}
Here is the caller graph for this function:

◆ Dar_ManCutsFree()

void Dar_ManCutsFree ( Dar_Man_t * p)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 648 of file darCut.c.

649{
650 if ( p->pMemCuts == NULL )
651 return;
652 Aig_MmFixedStop( p->pMemCuts, 0 );
653 p->pMemCuts = NULL;
654// Aig_ManCleanData( p );
655}
void Aig_MmFixedStop(Aig_MmFixed_t *p, int fVerbose)
Definition aigMem.c:132
Cube * p
Definition exorList.c:222
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Dar_ManCutsRestart()

void Dar_ManCutsRestart ( Dar_Man_t * p,
Aig_Obj_t * pRoot )

FUNCTION DECLARATIONS ///.

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 714 of file darCut.c.

715{
716 Aig_Obj_t * pObj;
717 int i;
718 Dar_ObjSetCuts( Aig_ManConst1(p->pAig), NULL );
719 Vec_PtrForEachEntry( Aig_Obj_t *, p->vCutNodes, pObj, i )
720 if ( !Aig_ObjIsNone(pObj) )
721 Dar_ObjSetCuts( pObj, NULL );
722 Vec_PtrClear( p->vCutNodes );
723 Aig_MmFixedRestart( p->pMemCuts );
724 Dar_ObjPrepareCuts( p, Aig_ManConst1(p->pAig) );
725}
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
void Aig_MmFixedRestart(Aig_MmFixed_t *p)
Definition aigMem.c:232
Dar_Cut_t * Dar_ObjPrepareCuts(Dar_Man_t *p, Aig_Obj_t *pObj)
Definition darCut.c:668
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Dar_ObjComputeCuts()

Dar_Cut_t * Dar_ObjComputeCuts ( Dar_Man_t * p,
Aig_Obj_t * pObj,
int fSkipTtMin )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 738 of file darCut.c.

739{
740 Aig_Obj_t * pFanin0 = Aig_ObjReal_rec( Aig_ObjChild0(pObj) );
741 Aig_Obj_t * pFanin1 = Aig_ObjReal_rec( Aig_ObjChild1(pObj) );
742 Aig_Obj_t * pFaninR0 = Aig_Regular(pFanin0);
743 Aig_Obj_t * pFaninR1 = Aig_Regular(pFanin1);
744 Dar_Cut_t * pCutSet, * pCut0, * pCut1, * pCut;
745 int i, k;
746
747 assert( !Aig_IsComplement(pObj) );
748 assert( Aig_ObjIsNode(pObj) );
749 assert( Dar_ObjCuts(pObj) == NULL );
750 assert( Dar_ObjCuts(pFaninR0) != NULL );
751 assert( Dar_ObjCuts(pFaninR1) != NULL );
752
753 // set up the first cut
754 pCutSet = Dar_ObjPrepareCuts( p, pObj );
755 // make sure fanins cuts are computed
756 Dar_ObjForEachCut( pFaninR0, pCut0, i )
757 Dar_ObjForEachCut( pFaninR1, pCut1, k )
758 {
759 p->nCutsAll++;
760 // make sure K-feasible cut exists
761 if ( Dar_WordCountOnes(pCut0->uSign | pCut1->uSign) > 4 )
762 continue;
763 // get the next cut of this node
764 pCut = Dar_CutFindFree( p, pObj );
765 // create the new cut
766 if ( !Dar_CutMerge( pCut, pCut0, pCut1 ) )
767 {
768 assert( !pCut->fUsed );
769 continue;
770 }
771 p->nCutsTried++;
772 // check dominance
773 if ( Dar_CutFilter( pObj, pCut ) )
774 {
775 assert( !pCut->fUsed );
776 continue;
777 }
778 // compute truth table
779 pCut->uTruth = 0xFFFF & Dar_CutTruth( pCut, pCut0, pCut1, Aig_IsComplement(pFanin0), Aig_IsComplement(pFanin1) );
780
781 // minimize support of the cut
782 if ( !fSkipTtMin && Dar_CutSuppMinimize( pCut ) )
783 {
784 int RetValue = Dar_CutFilter( pObj, pCut );
785 assert( !RetValue );
786 }
787
788 // assign the value of the cut
789 pCut->Value = Dar_CutFindValue( p, pCut );
790 // if the cut contains removed node, do not use it
791 if ( pCut->Value == 0 )
792 {
793 p->nCutsSkipped++;
794 pCut->fUsed = 0;
795 }
796 else if ( pCut->nLeaves < 2 )
797 return pCutSet;
798 }
799 // count the number of nontrivial cuts cuts
800 Dar_ObjForEachCut( pObj, pCut, i )
801 p->nCutsUsed += pCut->fUsed;
802 // discount trivial cut
803 p->nCutsUsed--;
804 return pCutSet;
805}
Aig_Obj_t * Aig_ObjReal_rec(Aig_Obj_t *pObj)
Definition aigUtil.c:476
struct Dar_Cut_t_ Dar_Cut_t
Definition darInt.h:52
#define Dar_ObjForEachCut(pObj, pCut, i)
Definition darInt.h:121
unsigned fUsed
Definition darInt.h:61
unsigned Value
Definition darInt.h:59
unsigned uSign
Definition darInt.h:57
unsigned uTruth
Definition darInt.h:58
#define assert(ex)
Definition util_old.h:213
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Dar_ObjComputeCuts_rec()

Dar_Cut_t * Dar_ObjComputeCuts_rec ( Dar_Man_t * p,
Aig_Obj_t * pObj )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 818 of file darCut.c.

819{
820 if ( Dar_ObjCuts(pObj) )
821 return Dar_ObjCuts(pObj);
822 if ( Aig_ObjIsCi(pObj) )
823 return Dar_ObjPrepareCuts( p, pObj );
824 if ( Aig_ObjIsBuf(pObj) )
825 return Dar_ObjComputeCuts_rec( p, Aig_ObjFanin0(pObj) );
826 Dar_ObjComputeCuts_rec( p, Aig_ObjFanin0(pObj) );
827 Dar_ObjComputeCuts_rec( p, Aig_ObjFanin1(pObj) );
828 return Dar_ObjComputeCuts( p, pObj, 0 );
829}
Dar_Cut_t * Dar_ObjComputeCuts(Dar_Man_t *p, Aig_Obj_t *pObj, int fSkipTtMin)
Definition darCut.c:738
Dar_Cut_t * Dar_ObjComputeCuts_rec(Dar_Man_t *p, Aig_Obj_t *pObj)
Definition darCut.c:818
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Dar_ObjCutPrint()

void Dar_ObjCutPrint ( Aig_Man_t * p,
Aig_Obj_t * pObj )

Function*************************************************************

Synopsis [Prints one cut.]

Description []

SideEffects []

SeeAlso []

Definition at line 65 of file darCut.c.

66{
67 Dar_Cut_t * pCut;
68 int i;
69 printf( "Cuts for node %d:\n", pObj->Id );
70 Dar_ObjForEachCut( pObj, pCut, i )
71 Dar_CutPrint( pCut );
72// printf( "\n" );
73}
ABC_NAMESPACE_IMPL_START void Dar_CutPrint(Dar_Cut_t *pCut)
DECLARATIONS ///.
Definition darCut.c:45
int Id
Definition aig.h:85
Here is the call graph for this function:

◆ Dar_ObjPrepareCuts()

Dar_Cut_t * Dar_ObjPrepareCuts ( Dar_Man_t * p,
Aig_Obj_t * pObj )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 668 of file darCut.c.

669{
670 Dar_Cut_t * pCutSet, * pCut;
671 int i;
672 assert( Dar_ObjCuts(pObj) == NULL );
673 pObj->nCuts = p->pPars->nCutsMax;
674 // create the cutset of the node
675 pCutSet = (Dar_Cut_t *)Aig_MmFixedEntryFetch( p->pMemCuts );
676 memset( pCutSet, 0, p->pPars->nCutsMax * sizeof(Dar_Cut_t) );
677 Dar_ObjSetCuts( pObj, pCutSet );
678 Dar_ObjForEachCutAll( pObj, pCut, i )
679 pCut->fUsed = 0;
680 Vec_PtrPush( p->vCutNodes, pObj );
681 // add unit cut if needed
682 pCut = pCutSet;
683 pCut->fUsed = 1;
684 if ( Aig_ObjIsConst1(pObj) )
685 {
686 pCut->nLeaves = 0;
687 pCut->uSign = 0;
688 pCut->uTruth = 0xFFFF;
689 }
690 else
691 {
692 pCut->nLeaves = 1;
693 pCut->pLeaves[0] = pObj->Id;
694 pCut->uSign = Aig_ObjCutSign( pObj->Id );
695 pCut->uTruth = 0xAAAA;
696 }
697 pCut->Value = Dar_CutFindValue( p, pCut );
698 if ( p->nCutMemUsed < Aig_MmFixedReadMemUsage(p->pMemCuts)/(1<<20) )
699 p->nCutMemUsed = Aig_MmFixedReadMemUsage(p->pMemCuts)/(1<<20);
700 return pCutSet;
701}
int Aig_MmFixedReadMemUsage(Aig_MmFixed_t *p)
Definition aigMem.c:271
char * Aig_MmFixedEntryFetch(Aig_MmFixed_t *p)
Definition aigMem.c:161
#define Dar_ObjForEachCutAll(pObj, pCut, i)
MACRO DEFINITIONS ///.
Definition darInt.h:119
unsigned nCuts
Definition aig.h:83
char * memset()
Here is the call graph for this function:
Here is the caller graph for this function: