blob: 99d5dc423b4544b4789f6776f6557c6809d423a9 [file] [log] [blame]
/**CFile****************************************************************
FileName [extraUtilMisc.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [extra]
Synopsis [Computing canonical forms of Boolean functions using truth tables.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: extraUtilMisc.c,v 1.0 2003/09/01 00:00:00 alanmi Exp $]
***********************************************************************/
#include "extra.h"
ABC_NAMESPACE_IMPL_START
/*---------------------------------------------------------------------------*/
/* Constant declarations */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Stucture declarations */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Type declarations */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Variable declarations */
/*---------------------------------------------------------------------------*/
static unsigned s_Truths3[256] =
{
0x00000000, 0x01010101, 0x01010101, 0x03030303, 0x01010101, 0x05050505, 0x06060606, 0x07070707,
0x01010101, 0x06060606, 0x05050505, 0x07070707, 0x03030303, 0x07070707, 0x07070707, 0x0f0f0f0f,
0x01010101, 0x11111111, 0x12121212, 0x13131313, 0x14141414, 0x15151515, 0x16161616, 0x17171717,
0x18181818, 0x19191919, 0x1a1a1a1a, 0x1b1b1b1b, 0x1c1c1c1c, 0x1d1d1d1d, 0x1e1e1e1e, 0x1f1f1f1f,
0x01010101, 0x12121212, 0x11111111, 0x13131313, 0x18181818, 0x1a1a1a1a, 0x19191919, 0x1b1b1b1b,
0x14141414, 0x16161616, 0x15151515, 0x17171717, 0x1c1c1c1c, 0x1e1e1e1e, 0x1d1d1d1d, 0x1f1f1f1f,
0x03030303, 0x13131313, 0x13131313, 0x33333333, 0x1c1c1c1c, 0x35353535, 0x36363636, 0x37373737,
0x1c1c1c1c, 0x36363636, 0x35353535, 0x37373737, 0x3c3c3c3c, 0x3d3d3d3d, 0x3d3d3d3d, 0x3f3f3f3f,
0x01010101, 0x14141414, 0x18181818, 0x1c1c1c1c, 0x11111111, 0x15151515, 0x19191919, 0x1d1d1d1d,
0x12121212, 0x16161616, 0x1a1a1a1a, 0x1e1e1e1e, 0x13131313, 0x17171717, 0x1b1b1b1b, 0x1f1f1f1f,
0x05050505, 0x15151515, 0x1a1a1a1a, 0x35353535, 0x15151515, 0x55555555, 0x56565656, 0x57575757,
0x1a1a1a1a, 0x56565656, 0x5a5a5a5a, 0x5b5b5b5b, 0x35353535, 0x57575757, 0x5b5b5b5b, 0x5f5f5f5f,
0x06060606, 0x16161616, 0x19191919, 0x36363636, 0x19191919, 0x56565656, 0x66666666, 0x67676767,
0x16161616, 0x69696969, 0x56565656, 0x6b6b6b6b, 0x36363636, 0x6b6b6b6b, 0x67676767, 0x6f6f6f6f,
0x07070707, 0x17171717, 0x1b1b1b1b, 0x37373737, 0x1d1d1d1d, 0x57575757, 0x67676767, 0x77777777,
0x1e1e1e1e, 0x6b6b6b6b, 0x5b5b5b5b, 0x7b7b7b7b, 0x3d3d3d3d, 0x7d7d7d7d, 0x7e7e7e7e, 0x7f7f7f7f,
0x01010101, 0x18181818, 0x14141414, 0x1c1c1c1c, 0x12121212, 0x1a1a1a1a, 0x16161616, 0x1e1e1e1e,
0x11111111, 0x19191919, 0x15151515, 0x1d1d1d1d, 0x13131313, 0x1b1b1b1b, 0x17171717, 0x1f1f1f1f,
0x06060606, 0x19191919, 0x16161616, 0x36363636, 0x16161616, 0x56565656, 0x69696969, 0x6b6b6b6b,
0x19191919, 0x66666666, 0x56565656, 0x67676767, 0x36363636, 0x67676767, 0x6b6b6b6b, 0x6f6f6f6f,
0x05050505, 0x1a1a1a1a, 0x15151515, 0x35353535, 0x1a1a1a1a, 0x5a5a5a5a, 0x56565656, 0x5b5b5b5b,
0x15151515, 0x56565656, 0x55555555, 0x57575757, 0x35353535, 0x5b5b5b5b, 0x57575757, 0x5f5f5f5f,
0x07070707, 0x1b1b1b1b, 0x17171717, 0x37373737, 0x1e1e1e1e, 0x5b5b5b5b, 0x6b6b6b6b, 0x7b7b7b7b,
0x1d1d1d1d, 0x67676767, 0x57575757, 0x77777777, 0x3d3d3d3d, 0x7e7e7e7e, 0x7d7d7d7d, 0x7f7f7f7f,
0x03030303, 0x1c1c1c1c, 0x1c1c1c1c, 0x3c3c3c3c, 0x13131313, 0x35353535, 0x36363636, 0x3d3d3d3d,
0x13131313, 0x36363636, 0x35353535, 0x3d3d3d3d, 0x33333333, 0x37373737, 0x37373737, 0x3f3f3f3f,
0x07070707, 0x1d1d1d1d, 0x1e1e1e1e, 0x3d3d3d3d, 0x17171717, 0x57575757, 0x6b6b6b6b, 0x7d7d7d7d,
0x1b1b1b1b, 0x67676767, 0x5b5b5b5b, 0x7e7e7e7e, 0x37373737, 0x77777777, 0x7b7b7b7b, 0x7f7f7f7f,
0x07070707, 0x1e1e1e1e, 0x1d1d1d1d, 0x3d3d3d3d, 0x1b1b1b1b, 0x5b5b5b5b, 0x67676767, 0x7e7e7e7e,
0x17171717, 0x6b6b6b6b, 0x57575757, 0x7d7d7d7d, 0x37373737, 0x7b7b7b7b, 0x77777777, 0x7f7f7f7f,
0x0f0f0f0f, 0x1f1f1f1f, 0x1f1f1f1f, 0x3f3f3f3f, 0x1f1f1f1f, 0x5f5f5f5f, 0x6f6f6f6f, 0x7f7f7f7f,
0x1f1f1f1f, 0x6f6f6f6f, 0x5f5f5f5f, 0x7f7f7f7f, 0x3f3f3f3f, 0x7f7f7f7f, 0x7f7f7f7f, 0xffffffff
};
static char s_Phases3[256][9] =
{
/* 0 */ { 8, 0, 1, 2, 3, 4, 5, 6, 7 },
/* 1 */ { 1, 0 },
/* 2 */ { 1, 1 },
/* 3 */ { 2, 0, 1 },
/* 4 */ { 1, 2 },
/* 5 */ { 2, 0, 2 },
/* 6 */ { 2, 0, 3 },
/* 7 */ { 1, 0 },
/* 8 */ { 1, 3 },
/* 9 */ { 2, 1, 2 },
/* 10 */ { 2, 1, 3 },
/* 11 */ { 1, 1 },
/* 12 */ { 2, 2, 3 },
/* 13 */ { 1, 2 },
/* 14 */ { 1, 3 },
/* 15 */ { 4, 0, 1, 2, 3 },
/* 16 */ { 1, 4 },
/* 17 */ { 2, 0, 4 },
/* 18 */ { 2, 0, 5 },
/* 19 */ { 1, 0 },
/* 20 */ { 2, 0, 6 },
/* 21 */ { 1, 0 },
/* 22 */ { 1, 0 },
/* 23 */ { 1, 0 },
/* 24 */ { 2, 0, 7 },
/* 25 */ { 1, 0 },
/* 26 */ { 1, 0 },
/* 27 */ { 1, 0 },
/* 28 */ { 1, 0 },
/* 29 */ { 1, 0 },
/* 30 */ { 1, 0 },
/* 31 */ { 1, 0 },
/* 32 */ { 1, 5 },
/* 33 */ { 2, 1, 4 },
/* 34 */ { 2, 1, 5 },
/* 35 */ { 1, 1 },
/* 36 */ { 2, 1, 6 },
/* 37 */ { 1, 1 },
/* 38 */ { 1, 1 },
/* 39 */ { 1, 1 },
/* 40 */ { 2, 1, 7 },
/* 41 */ { 1, 1 },
/* 42 */ { 1, 1 },
/* 43 */ { 1, 1 },
/* 44 */ { 1, 1 },
/* 45 */ { 1, 1 },
/* 46 */ { 1, 1 },
/* 47 */ { 1, 1 },
/* 48 */ { 2, 4, 5 },
/* 49 */ { 1, 4 },
/* 50 */ { 1, 5 },
/* 51 */ { 4, 0, 1, 4, 5 },
/* 52 */ { 1, 6 },
/* 53 */ { 1, 0 },
/* 54 */ { 1, 0 },
/* 55 */ { 1, 0 },
/* 56 */ { 1, 7 },
/* 57 */ { 1, 1 },
/* 58 */ { 1, 1 },
/* 59 */ { 1, 1 },
/* 60 */ { 4, 0, 1, 6, 7 },
/* 61 */ { 1, 0 },
/* 62 */ { 1, 1 },
/* 63 */ { 2, 0, 1 },
/* 64 */ { 1, 6 },
/* 65 */ { 2, 2, 4 },
/* 66 */ { 2, 2, 5 },
/* 67 */ { 1, 2 },
/* 68 */ { 2, 2, 6 },
/* 69 */ { 1, 2 },
/* 70 */ { 1, 2 },
/* 71 */ { 1, 2 },
/* 72 */ { 2, 2, 7 },
/* 73 */ { 1, 2 },
/* 74 */ { 1, 2 },
/* 75 */ { 1, 2 },
/* 76 */ { 1, 2 },
/* 77 */ { 1, 2 },
/* 78 */ { 1, 2 },
/* 79 */ { 1, 2 },
/* 80 */ { 2, 4, 6 },
/* 81 */ { 1, 4 },
/* 82 */ { 1, 5 },
/* 83 */ { 1, 4 },
/* 84 */ { 1, 6 },
/* 85 */ { 4, 0, 2, 4, 6 },
/* 86 */ { 1, 0 },
/* 87 */ { 1, 0 },
/* 88 */ { 1, 7 },
/* 89 */ { 1, 2 },
/* 90 */ { 4, 0, 2, 5, 7 },
/* 91 */ { 1, 0 },
/* 92 */ { 1, 6 },
/* 93 */ { 1, 2 },
/* 94 */ { 1, 2 },
/* 95 */ { 2, 0, 2 },
/* 96 */ { 2, 4, 7 },
/* 97 */ { 1, 4 },
/* 98 */ { 1, 5 },
/* 99 */ { 1, 4 },
/* 100 */ { 1, 6 },
/* 101 */ { 1, 4 },
/* 102 */ { 4, 0, 3, 4, 7 },
/* 103 */ { 1, 0 },
/* 104 */ { 1, 7 },
/* 105 */ { 4, 0, 3, 5, 6 },
/* 106 */ { 1, 7 },
/* 107 */ { 1, 0 },
/* 108 */ { 1, 7 },
/* 109 */ { 1, 3 },
/* 110 */ { 1, 3 },
/* 111 */ { 2, 0, 3 },
/* 112 */ { 1, 4 },
/* 113 */ { 1, 4 },
/* 114 */ { 1, 5 },
/* 115 */ { 1, 4 },
/* 116 */ { 1, 6 },
/* 117 */ { 1, 4 },
/* 118 */ { 1, 4 },
/* 119 */ { 2, 0, 4 },
/* 120 */ { 1, 7 },
/* 121 */ { 1, 5 },
/* 122 */ { 1, 5 },
/* 123 */ { 2, 0, 5 },
/* 124 */ { 1, 6 },
/* 125 */ { 2, 0, 6 },
/* 126 */ { 2, 0, 7 },
/* 127 */ { 1, 0 },
/* 128 */ { 1, 7 },
/* 129 */ { 2, 3, 4 },
/* 130 */ { 2, 3, 5 },
/* 131 */ { 1, 3 },
/* 132 */ { 2, 3, 6 },
/* 133 */ { 1, 3 },
/* 134 */ { 1, 3 },
/* 135 */ { 1, 3 },
/* 136 */ { 2, 3, 7 },
/* 137 */ { 1, 3 },
/* 138 */ { 1, 3 },
/* 139 */ { 1, 3 },
/* 140 */ { 1, 3 },
/* 141 */ { 1, 3 },
/* 142 */ { 1, 3 },
/* 143 */ { 1, 3 },
/* 144 */ { 2, 5, 6 },
/* 145 */ { 1, 4 },
/* 146 */ { 1, 5 },
/* 147 */ { 1, 5 },
/* 148 */ { 1, 6 },
/* 149 */ { 1, 6 },
/* 150 */ { 4, 1, 2, 4, 7 },
/* 151 */ { 1, 1 },
/* 152 */ { 1, 7 },
/* 153 */ { 4, 1, 2, 5, 6 },
/* 154 */ { 1, 5 },
/* 155 */ { 1, 1 },
/* 156 */ { 1, 6 },
/* 157 */ { 1, 2 },
/* 158 */ { 1, 2 },
/* 159 */ { 2, 1, 2 },
/* 160 */ { 2, 5, 7 },
/* 161 */ { 1, 4 },
/* 162 */ { 1, 5 },
/* 163 */ { 1, 5 },
/* 164 */ { 1, 6 },
/* 165 */ { 4, 1, 3, 4, 6 },
/* 166 */ { 1, 3 },
/* 167 */ { 1, 1 },
/* 168 */ { 1, 7 },
/* 169 */ { 1, 1 },
/* 170 */ { 4, 1, 3, 5, 7 },
/* 171 */ { 1, 1 },
/* 172 */ { 1, 7 },
/* 173 */ { 1, 3 },
/* 174 */ { 1, 3 },
/* 175 */ { 2, 1, 3 },
/* 176 */ { 1, 5 },
/* 177 */ { 1, 4 },
/* 178 */ { 1, 5 },
/* 179 */ { 1, 5 },
/* 180 */ { 1, 6 },
/* 181 */ { 1, 4 },
/* 182 */ { 1, 4 },
/* 183 */ { 2, 1, 4 },
/* 184 */ { 1, 7 },
/* 185 */ { 1, 5 },
/* 186 */ { 1, 5 },
/* 187 */ { 2, 1, 5 },
/* 188 */ { 1, 7 },
/* 189 */ { 2, 1, 6 },
/* 190 */ { 2, 1, 7 },
/* 191 */ { 1, 1 },
/* 192 */ { 2, 6, 7 },
/* 193 */ { 1, 4 },
/* 194 */ { 1, 5 },
/* 195 */ { 4, 2, 3, 4, 5 },
/* 196 */ { 1, 6 },
/* 197 */ { 1, 2 },
/* 198 */ { 1, 3 },
/* 199 */ { 1, 2 },
/* 200 */ { 1, 7 },
/* 201 */ { 1, 2 },
/* 202 */ { 1, 3 },
/* 203 */ { 1, 3 },
/* 204 */ { 4, 2, 3, 6, 7 },
/* 205 */ { 1, 2 },
/* 206 */ { 1, 3 },
/* 207 */ { 2, 2, 3 },
/* 208 */ { 1, 6 },
/* 209 */ { 1, 4 },
/* 210 */ { 1, 5 },
/* 211 */ { 1, 4 },
/* 212 */ { 1, 6 },
/* 213 */ { 1, 6 },
/* 214 */ { 1, 7 },
/* 215 */ { 2, 2, 4 },
/* 216 */ { 1, 7 },
/* 217 */ { 1, 6 },
/* 218 */ { 1, 7 },
/* 219 */ { 2, 2, 5 },
/* 220 */ { 1, 6 },
/* 221 */ { 2, 2, 6 },
/* 222 */ { 2, 2, 7 },
/* 223 */ { 1, 2 },
/* 224 */ { 1, 7 },
/* 225 */ { 1, 4 },
/* 226 */ { 1, 5 },
/* 227 */ { 1, 5 },
/* 228 */ { 1, 6 },
/* 229 */ { 1, 6 },
/* 230 */ { 1, 7 },
/* 231 */ { 2, 3, 4 },
/* 232 */ { 1, 7 },
/* 233 */ { 1, 6 },
/* 234 */ { 1, 7 },
/* 235 */ { 2, 3, 5 },
/* 236 */ { 1, 7 },
/* 237 */ { 2, 3, 6 },
/* 238 */ { 2, 3, 7 },
/* 239 */ { 1, 3 },
/* 240 */ { 4, 4, 5, 6, 7 },
/* 241 */ { 1, 4 },
/* 242 */ { 1, 5 },
/* 243 */ { 2, 4, 5 },
/* 244 */ { 1, 6 },
/* 245 */ { 2, 4, 6 },
/* 246 */ { 2, 4, 7 },
/* 247 */ { 1, 4 },
/* 248 */ { 1, 7 },
/* 249 */ { 2, 5, 6 },
/* 250 */ { 2, 5, 7 },
/* 251 */ { 1, 5 },
/* 252 */ { 2, 6, 7 },
/* 253 */ { 1, 6 },
/* 254 */ { 1, 7 },
/* 255 */ { 8, 0, 1, 2, 3, 4, 5, 6, 7 }
};
/*---------------------------------------------------------------------------*/
/* Macro declarations */
/*---------------------------------------------------------------------------*/
/**AutomaticStart*************************************************************/
/*---------------------------------------------------------------------------*/
/* Static function prototypes */
/*---------------------------------------------------------------------------*/
static int Extra_TruthCanonN_rec( int nVars, unsigned char * pt, unsigned ** pptRes, char ** ppfRes, int Flag );
/**AutomaticEnd***************************************************************/
/*---------------------------------------------------------------------------*/
/* Definition of exported functions */
/*---------------------------------------------------------------------------*/
/**Function********************************************************************
Synopsis [Computes the N-canonical form of the Boolean function up to 6 inputs.]
Description [The N-canonical form is defined as the truth table with
the minimum integer value. This function exhaustively enumerates
through the complete set of 2^N phase assignments.
Returns pointers to the static storage to the truth table and phases.
This data should be used before the function is called again.]
SideEffects []
SeeAlso []
******************************************************************************/
int Extra_TruthCanonFastN( int nVarsMax, int nVarsReal, unsigned * pt, unsigned ** pptRes, char ** ppfRes )
{
static unsigned uTruthStore6[2];
int RetValue;
assert( nVarsMax <= 6 );
assert( nVarsReal <= nVarsMax );
RetValue = Extra_TruthCanonN_rec( nVarsReal <= 3? 3: nVarsReal, (unsigned char *)pt, pptRes, ppfRes, 0 );
if ( nVarsMax == 6 && nVarsReal < nVarsMax )
{
uTruthStore6[0] = **pptRes;
uTruthStore6[1] = **pptRes;
*pptRes = uTruthStore6;
}
return RetValue;
}
/*---------------------------------------------------------------------------*/
/* Definition of internal functions */
/*---------------------------------------------------------------------------*/
/**Function*************************************************************
Synopsis [Recursive implementation of the above.]
Description []
SideEffects [This procedure has a bug, which shows on Solaris.
Most likely has something to do with the casts, i.g *((unsigned *)pt0)]
SeeAlso []
***********************************************************************/
int Extra_TruthCanonN_rec( int nVars, unsigned char * pt, unsigned ** pptRes, char ** ppfRes, int Flag )
{
static unsigned uTruthStore[7][2][2];
static char uPhaseStore[7][2][64];
unsigned char * pt0, * pt1;
unsigned * ptRes0, * ptRes1, * ptRes;
unsigned uInit0, uInit1, uTruth0, uTruth1, uTemp;
char * pfRes0, * pfRes1, * pfRes;
int nf0, nf1, nfRes, i, nVarsN;
// table lookup for three vars
if ( nVars == 3 )
{
*pptRes = &s_Truths3[*pt];
*ppfRes = s_Phases3[*pt]+1;
return s_Phases3[*pt][0];
}
// number of vars for the next call
nVarsN = nVars-1;
// truth table for the next call
pt0 = pt;
pt1 = pt + (1 << nVarsN) / 8;
// 5-var truth tables for this call
// uInit0 = *((unsigned *)pt0);
// uInit1 = *((unsigned *)pt1);
if ( nVarsN == 3 )
{
uInit0 = (pt0[0] << 24) | (pt0[0] << 16) | (pt0[0] << 8) | pt0[0];
uInit1 = (pt1[0] << 24) | (pt1[0] << 16) | (pt1[0] << 8) | pt1[0];
}
else if ( nVarsN == 4 )
{
uInit0 = (pt0[1] << 24) | (pt0[0] << 16) | (pt0[1] << 8) | pt0[0];
uInit1 = (pt1[1] << 24) | (pt1[0] << 16) | (pt1[1] << 8) | pt1[0];
}
else
{
uInit0 = (pt0[3] << 24) | (pt0[2] << 16) | (pt0[1] << 8) | pt0[0];
uInit1 = (pt1[3] << 24) | (pt1[2] << 16) | (pt1[1] << 8) | pt1[0];
}
// storage for truth tables and phases
ptRes = uTruthStore[nVars][Flag];
pfRes = uPhaseStore[nVars][Flag];
// solve trivial cases
if ( uInit1 == 0 )
{
nf0 = Extra_TruthCanonN_rec( nVarsN, pt0, &ptRes0, &pfRes0, 0 );
uTruth1 = uInit1;
uTruth0 = *ptRes0;
nfRes = 0;
for ( i = 0; i < nf0; i++ )
pfRes[nfRes++] = pfRes0[i];
goto finish;
}
if ( uInit0 == 0 )
{
nf1 = Extra_TruthCanonN_rec( nVarsN, pt1, &ptRes1, &pfRes1, 1 );
uTruth1 = uInit0;
uTruth0 = *ptRes1;
nfRes = 0;
for ( i = 0; i < nf1; i++ )
pfRes[nfRes++] = pfRes1[i] | (1<<nVarsN);
goto finish;
}
if ( uInit1 == 0xFFFFFFFF )
{
nf0 = Extra_TruthCanonN_rec( nVarsN, pt0, &ptRes0, &pfRes0, 0 );
uTruth1 = *ptRes0;
uTruth0 = uInit1;
nfRes = 0;
for ( i = 0; i < nf0; i++ )
pfRes[nfRes++] = pfRes0[i] | (1<<nVarsN);
goto finish;
}
if ( uInit0 == 0xFFFFFFFF )
{
nf1 = Extra_TruthCanonN_rec( nVarsN, pt1, &ptRes1, &pfRes1, 1 );
uTruth1 = *ptRes1;
uTruth0 = uInit0;
nfRes = 0;
for ( i = 0; i < nf1; i++ )
pfRes[nfRes++] = pfRes1[i];
goto finish;
}
// solve the problem for cofactors
nf0 = Extra_TruthCanonN_rec( nVarsN, pt0, &ptRes0, &pfRes0, 0 );
nf1 = Extra_TruthCanonN_rec( nVarsN, pt1, &ptRes1, &pfRes1, 1 );
// combine the result
if ( *ptRes1 < *ptRes0 )
{
uTruth0 = 0xFFFFFFFF;
nfRes = 0;
for ( i = 0; i < nf1; i++ )
{
uTemp = Extra_TruthPolarize( uInit0, pfRes1[i], nVarsN );
if ( uTruth0 > uTemp )
{
nfRes = 0;
uTruth0 = uTemp;
pfRes[nfRes++] = pfRes1[i];
}
else if ( uTruth0 == uTemp )
pfRes[nfRes++] = pfRes1[i];
}
uTruth1 = *ptRes1;
}
else if ( *ptRes1 > *ptRes0 )
{
uTruth0 = 0xFFFFFFFF;
nfRes = 0;
for ( i = 0; i < nf0; i++ )
{
uTemp = Extra_TruthPolarize( uInit1, pfRes0[i], nVarsN );
if ( uTruth0 > uTemp )
{
nfRes = 0;
uTruth0 = uTemp;
pfRes[nfRes++] = pfRes0[i] | (1<<nVarsN);
}
else if ( uTruth0 == uTemp )
pfRes[nfRes++] = pfRes0[i] | (1<<nVarsN);
}
uTruth1 = *ptRes0;
}
else
{
assert( nf0 == nf1 );
nfRes = 0;
for ( i = 0; i < nf1; i++ )
pfRes[nfRes++] = pfRes1[i];
for ( i = 0; i < nf0; i++ )
pfRes[nfRes++] = pfRes0[i] | (1<<nVarsN);
uTruth0 = Extra_TruthPolarize( uInit0, pfRes1[0], nVarsN );
uTruth1 = *ptRes0;
}
finish :
if ( nVarsN == 3 )
{
uTruth0 &= 0xFF;
uTruth1 &= 0xFF;
uTemp = (uTruth1 << 8) | uTruth0;
*ptRes = (uTemp << 16) | uTemp;
}
else if ( nVarsN == 4 )
{
uTruth0 &= 0xFFFF;
uTruth1 &= 0xFFFF;
*ptRes = (uTruth1 << 16) | uTruth0;
}
else if ( nVarsN == 5 )
{
*(ptRes+0) = uTruth0;
*(ptRes+1) = uTruth1;
}
*pptRes = ptRes;
*ppfRes = pfRes;
return nfRes;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Map_Var3Print()
{
extern void Extra_Truth3VarN( unsigned ** puCanons, char *** puPhases, char ** ppCounters );
unsigned * uCanons;
char ** uPhases;
char * pCounters;
int i, k;
Extra_Truth3VarN( &uCanons, &uPhases, &pCounters );
for ( i = 0; i < 256; i++ )
{
if ( i % 8 == 0 )
printf( "\n" );
Extra_PrintHex( stdout, uCanons + i, 5 );
printf( ", " );
}
printf( "\n" );
for ( i = 0; i < 256; i++ )
{
printf( "%3d */ { %2d, ", i, pCounters[i] );
for ( k = 0; k < pCounters[i]; k++ )
printf( "%s%d", k? ", ":"", uPhases[i][k] );
printf( " }\n" );
}
printf( "\n" );
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Map_Var3Test()
{
extern void Extra_Truth3VarN( unsigned ** puCanons, char *** puPhases, char ** ppCounters );
unsigned * uCanons;
char ** uPhases;
char * pCounters;
int i;
unsigned * ptRes;
char * pfRes;
unsigned uTruth;
int Count;
Extra_Truth3VarN( &uCanons, &uPhases, &pCounters );
for ( i = 0; i < 256; i++ )
{
uTruth = i;
Count = Extra_TruthCanonFastN( 5, 3, &uTruth, &ptRes, &pfRes );
}
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Map_Var4Test()
{
extern void Extra_Truth4VarN( unsigned short ** puCanons, char *** puPhases, char ** ppCounters, int PhaseMax );
unsigned short * uCanons;
char ** uPhases;
char * pCounters;
int i;
unsigned * ptRes;
char * pfRes;
unsigned uTruth;
int Count;
Extra_Truth4VarN( &uCanons, &uPhases, &pCounters, 16 );
for ( i = 0; i < 256*256; i++ )
{
uTruth = i;
Count = Extra_TruthCanonFastN( 5, 4, &uTruth, &ptRes, &pfRes );
}
}
/*---------------------------------------------------------------------------*/
/* Definition of static Functions */
/*---------------------------------------------------------------------------*/
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END