blob: c8b40a82b53105dc0964b55945fd942bf54a9cbd [file] [log] [blame]
/**CFile****************************************************************
FileName [exorCubes.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Exclusive sum-of-product minimization.]
Synopsis [Cube manipulation.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: exorCubes.c,v 1.0 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
////////////////////////////////////////////////////////////////////////
/// ///
/// Implementation of EXORCISM - 4 ///
/// An Exclusive Sum-of-Product Minimizer ///
/// ///
/// Alan Mishchenko <alanmi@ee.pdx.edu> ///
/// ///
////////////////////////////////////////////////////////////////////////
/// ///
/// Cube Allocation and Free Cube Management ///
/// ///
/// Ver. 1.0. Started - July 18, 2000. Last update - July 20, 2000 ///
/// Ver. 1.1. Started - July 24, 2000. Last update - July 29, 2000 ///
/// Ver. 1.2. Started - July 30, 2000. Last update - July 30, 2000 ///
/// Ver. 1.5. Started - Aug 19, 2000. Last update - Aug 19, 2000 ///
/// ///
////////////////////////////////////////////////////////////////////////
/// This software was tested with the BDD package "CUDD", v.2.3.0 ///
/// by Fabio Somenzi ///
/// http://vlsi.colorado.edu/~fabio/ ///
////////////////////////////////////////////////////////////////////////
#include "exor.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// EXTERNAL FUNCTIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// EXTERNAL VARIABLES ///
////////////////////////////////////////////////////////////////////////
// information about the cube cover before and after simplification
extern cinfo g_CoverInfo;
////////////////////////////////////////////////////////////////////////
/// FUNCTIONS OF THIS MODULE ///
////////////////////////////////////////////////////////////////////////
// cube cover memory allocation/delocation procedures
// (called from the ExorMain module)
int AllocateCover( int nCubes, int nWordsIn, int nWordsOut );
void DelocateCover();
// manipulation of the free cube list
// (called from Pseudo-Kronecker, ExorList, and ExorLink modules)
void AddToFreeCubes( Cube * pC );
Cube * GetFreeCube();
////////////////////////////////////////////////////////////////////////
/// EXPORTED VARIABLES ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// STATIC VARIABLES ///
////////////////////////////////////////////////////////////////////////
// the pointer to the allocated memory
Cube ** s_pCoverMemory;
// the list of free cubes
Cube * s_CubesFree;
///////////////////////////////////////////////////////////////////
/// CUBE COVER MEMORY MANAGEMENT //
///////////////////////////////////////////////////////////////////
int AllocateCover( int nCubes, int nWordsIn, int nWordsOut )
// uses the cover parameters nCubes and nWords
// to allocate-and-clean the cover in one large piece
{
int OneCubeSize;
int OneInputSetSize;
Cube ** pp;
int TotalSize;
int i, k;
// determine the size of one cube WITH storage for bits
OneCubeSize = sizeof(Cube) + (nWordsIn+nWordsOut)*sizeof(unsigned);
// determine what is the amount of storage for the input part of the cube
OneInputSetSize = nWordsIn*sizeof(unsigned);
// allocate memory for the array of pointers
pp = (Cube **)ABC_ALLOC( Cube *, nCubes );
if ( pp == NULL )
return 0;
// determine the size of the total cube cover
TotalSize = nCubes*OneCubeSize;
// allocate and clear memory for the cover in one large piece
pp[0] = (Cube *)ABC_ALLOC( char, TotalSize );
if ( pp[0] == NULL )
return 0;
memset( pp[0], 0, TotalSize );
// assign pointers to cubes and bit strings inside this piece
pp[0]->pCubeDataIn = (unsigned*)(pp[0] + 1);
pp[0]->pCubeDataOut = (unsigned*)((char*)pp[0]->pCubeDataIn + OneInputSetSize);
for ( i = 1; i < nCubes; i++ )
{
pp[i] = (Cube *)((char*)pp[i-1] + OneCubeSize);
pp[i]->pCubeDataIn = (unsigned*)(pp[i] + 1);
pp[i]->pCubeDataOut = (unsigned*)((char*)pp[i]->pCubeDataIn + OneInputSetSize);
}
// connect the cubes into the list using Next pointers
for ( k = 0; k < nCubes-1; k++ )
pp[k]->Next = pp[k+1];
// the last pointer is already set to NULL
// assign the head of the free list
s_CubesFree = pp[0];
// set the counters of the used and free cubes
g_CoverInfo.nCubesInUse = 0;
g_CoverInfo.nCubesFree = nCubes;
// save the pointer to the allocated memory
s_pCoverMemory = pp;
assert ( g_CoverInfo.nCubesInUse + g_CoverInfo.nCubesFree == g_CoverInfo.nCubesAlloc );
return nCubes*sizeof(Cube *) + TotalSize;
}
void DelocateCover()
{
ABC_FREE( s_pCoverMemory[0] );
ABC_FREE( s_pCoverMemory );
}
///////////////////////////////////////////////////////////////////
/// FREE CUBE LIST MANIPULATION FUNCTIONS ///
///////////////////////////////////////////////////////////////////
void AddToFreeCubes( Cube * p )
{
assert( p );
assert( p->Prev == NULL ); // the cube should not be in use
assert( p->Next == NULL );
assert( p->ID );
p->Next = s_CubesFree;
s_CubesFree = p;
// set the ID of the cube to 0,
// so that cube pair garbage collection could recognize it as different
p->ID = 0;
g_CoverInfo.nCubesFree++;
}
Cube * GetFreeCube()
{
Cube * p;
assert( s_CubesFree );
p = s_CubesFree;
s_CubesFree = s_CubesFree->Next;
p->Next = NULL;
g_CoverInfo.nCubesFree--;
return p;
}
///////////////////////////////////////////////////////////////////
//////////// End of File /////////////////
///////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END