1 /**CFile****************************************************************
2 
3   FileName    [mvcCube.c]
4 
5   PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]
6 
7   Synopsis    [Manipulating unate cubes.]
8 
9   Author      [MVSIS Group]
10 
11   Affiliation [UC Berkeley]
12 
13   Date        [Ver. 1.0. Started - February 1, 2003.]
14 
15   Revision    [$Id: mvcCube.c,v 1.4 2003/04/03 06:31:49 alanmi Exp $]
16 
17 ***********************************************************************/
18 
19 #include "mvc.h"
20 
21 ABC_NAMESPACE_IMPL_START
22 
23 
24 ////////////////////////////////////////////////////////////////////////
25 ///                        DECLARATIONS                              ///
26 ////////////////////////////////////////////////////////////////////////
27 
28 ////////////////////////////////////////////////////////////////////////
29 ///                     FUNCTION DEFINITIONS                         ///
30 ////////////////////////////////////////////////////////////////////////
31 
32 /**Function*************************************************************
33 
34   Synopsis    []
35 
36   Description []
37 
38   SideEffects []
39 
40   SeeAlso     []
41 
42 ***********************************************************************/
Mvc_CubeAlloc(Mvc_Cover_t * pCover)43 Mvc_Cube_t * Mvc_CubeAlloc( Mvc_Cover_t * pCover )
44 {
45     Mvc_Cube_t * pCube;
46 
47     assert( pCover->nWords >= 0 );
48     // allocate the cube
49 #ifdef USE_SYSTEM_MEMORY_MANAGEMENT
50     if ( pCover->nWords == 0 )
51         pCube = (Mvc_Cube_t *)ABC_ALLOC( char, sizeof(Mvc_Cube_t) );
52     else
53         pCube = (Mvc_Cube_t *)ABC_ALLOC( char,  sizeof(Mvc_Cube_t) + sizeof(Mvc_CubeWord_t) * (pCover->nWords - 1) );
54 #else
55     switch( pCover->nWords )
56     {
57     case 0:
58     case 1:
59         pCube = (Mvc_Cube_t *)Extra_MmFixedEntryFetch( pCover->pMem->pMan1 );
60         break;
61     case 2:
62         pCube = (Mvc_Cube_t *)Extra_MmFixedEntryFetch( pCover->pMem->pMan2 );
63         break;
64     case 3:
65     case 4:
66         pCube = (Mvc_Cube_t *)Extra_MmFixedEntryFetch( pCover->pMem->pMan4 );
67         break;
68     default:
69         pCube = (Mvc_Cube_t *)ABC_ALLOC( char, sizeof(Mvc_Cube_t) + sizeof(Mvc_CubeWord_t) * (pCover->nWords - 1) );
70         break;
71     }
72 #endif
73     // set the parameters charactering this cube
74     if ( pCover->nWords == 0 )
75         pCube->iLast   = pCover->nWords;
76     else
77         pCube->iLast   = pCover->nWords - 1;
78     pCube->nUnused = pCover->nUnused;
79     return pCube;
80 }
81 
82 
83 /**Function*************************************************************
84 
85   Synopsis    []
86 
87   Description []
88 
89   SideEffects []
90 
91   SeeAlso     []
92 
93 ***********************************************************************/
Mvc_CubeDup(Mvc_Cover_t * pCover,Mvc_Cube_t * pCube)94 Mvc_Cube_t * Mvc_CubeDup( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
95 {
96     Mvc_Cube_t * pCubeCopy;
97     pCubeCopy = Mvc_CubeAlloc( pCover );
98     Mvc_CubeBitCopy( pCubeCopy, pCube );
99     return pCubeCopy;
100 }
101 
102 
103 /**Function*************************************************************
104 
105   Synopsis    []
106 
107   Description []
108 
109   SideEffects []
110 
111   SeeAlso     []
112 
113 ***********************************************************************/
Mvc_CubeFree(Mvc_Cover_t * pCover,Mvc_Cube_t * pCube)114 void Mvc_CubeFree( Mvc_Cover_t * pCover, Mvc_Cube_t * pCube )
115 {
116     if ( pCube == NULL )
117         return;
118 
119     // verify the parameters charactering this cube
120     assert( pCube->iLast == 0 || ((int)pCube->iLast) == pCover->nWords - 1 );
121     assert( ((int)pCube->nUnused) == pCover->nUnused );
122 
123     // deallocate the cube
124 #ifdef USE_SYSTEM_MEMORY_MANAGEMENT
125     ABC_FREE( pCube );
126 #else
127     switch( pCover->nWords )
128     {
129     case 0:
130     case 1:
131         Extra_MmFixedEntryRecycle( pCover->pMem->pMan1, (char *)pCube );
132         break;
133     case 2:
134         Extra_MmFixedEntryRecycle( pCover->pMem->pMan2, (char *)pCube );
135         break;
136     case 3:
137     case 4:
138         Extra_MmFixedEntryRecycle( pCover->pMem->pMan4, (char *)pCube );
139         break;
140     default:
141         ABC_FREE( pCube );
142         break;
143     }
144 #endif
145 }
146 
147 
148 /**Function*************************************************************
149 
150   Synopsis    [Removes the don't-care variable from the cube.]
151 
152   Description []
153 
154   SideEffects []
155 
156   SeeAlso     []
157 
158 ***********************************************************************/
Mvc_CubeBitRemoveDcs(Mvc_Cube_t * pCube)159 void Mvc_CubeBitRemoveDcs( Mvc_Cube_t * pCube )
160 {
161     unsigned Mask;
162     int i;
163     for ( i = Mvc_CubeReadLast(pCube); i >= 0; i-- )
164     {
165         // detect those variables that are different (not DCs)
166         Mask = (pCube->pData[i] ^ (pCube->pData[i] >> 1)) & BITS_DISJOINT;
167         // create the mask of all that are different
168         Mask |= (Mask << 1);
169         // remove other bits from the set
170         pCube->pData[i] &= Mask;
171     }
172 }
173 
174 ////////////////////////////////////////////////////////////////////////
175 ///                       END OF FILE                                ///
176 ////////////////////////////////////////////////////////////////////////
177 
178 
179 ABC_NAMESPACE_IMPL_END
180 
181