summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2016-10-21 17:50:32 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2016-10-21 17:50:32 -0700
commit9c7741efd9da255cad64b758032da33bb946259b (patch)
treeac38457b0a77e1054c67b0ce3993f40d754f7bc6 /src
parentf5069d667579db639d45fe7f357a7cf72bc3fcbd (diff)
downloadabc-9c7741efd9da255cad64b758032da33bb946259b.tar.gz
abc-9c7741efd9da255cad64b758032da33bb946259b.tar.bz2
abc-9c7741efd9da255cad64b758032da33bb946259b.zip
Code for profiling arithmetic circuits.
Diffstat (limited to 'src')
-rw-r--r--src/proof/acec/acecSt.c420
1 files changed, 420 insertions, 0 deletions
diff --git a/src/proof/acec/acecSt.c b/src/proof/acec/acecSt.c
new file mode 100644
index 00000000..4c61715e
--- /dev/null
+++ b/src/proof/acec/acecSt.c
@@ -0,0 +1,420 @@
+/**CFile****************************************************************
+
+ FileName [acecSt.c]
+
+ SystemName [ABC: Logic synthesis and verification system.]
+
+ PackageName [CEC for arithmetic circuits.]
+
+ Synopsis [Core procedures.]
+
+ Author [Alan Mishchenko]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - June 20, 2005.]
+
+ Revision [$Id: acecSt.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#include "acecInt.h"
+#include "misc/vec/vecWec.h"
+#include "misc/extra/extra.h"
+
+ABC_NAMESPACE_IMPL_START
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+int Npn3Table[256][2] = {
+ {0x00, 0}, // 0x00 = 0
+ {0x01, 1}, // 0x01 = 1
+ {0x01, 1}, // 0x02 = 2
+ {0x03, 2}, // 0x03 = 3
+ {0x01, 1}, // 0x04 = 4
+ {0x03, 2}, // 0x05 = 5
+ {0x06, 3}, // 0x06 = 6
+ {0x07, 4}, // 0x07 = 7
+ {0x01, 1}, // 0x08 = 8
+ {0x06, 3}, // 0x09 = 9
+ {0x03, 2}, // 0x0A = 10
+ {0x07, 4}, // 0x0B = 11
+ {0x03, 2}, // 0x0C = 12
+ {0x07, 4}, // 0x0D = 13
+ {0x07, 4}, // 0x0E = 14
+ {0x0F, 5}, // 0x0F = 15
+ {0x01, 1}, // 0x10 = 16
+ {0x03, 2}, // 0x11 = 17
+ {0x06, 3}, // 0x12 = 18
+ {0x07, 4}, // 0x13 = 19
+ {0x06, 3}, // 0x14 = 20
+ {0x07, 4}, // 0x15 = 21
+ {0x16, 6}, // 0x16 = 22
+ {0x17, 7}, // 0x17 = 23
+ {0x18, 8}, // 0x18 = 24
+ {0x19, 9}, // 0x19 = 25
+ {0x19, 9}, // 0x1A = 26
+ {0x1B, 10}, // 0x1B = 27
+ {0x19, 9}, // 0x1C = 28
+ {0x1B, 10}, // 0x1D = 29
+ {0x1E, 11}, // 0x1E = 30
+ {0x07, 4}, // 0x1F = 31
+ {0x01, 1}, // 0x20 = 32
+ {0x06, 3}, // 0x21 = 33
+ {0x03, 2}, // 0x22 = 34
+ {0x07, 4}, // 0x23 = 35
+ {0x18, 8}, // 0x24 = 36
+ {0x19, 9}, // 0x25 = 37
+ {0x19, 9}, // 0x26 = 38
+ {0x1B, 10}, // 0x27 = 39
+ {0x06, 3}, // 0x28 = 40
+ {0x16, 6}, // 0x29 = 41
+ {0x07, 4}, // 0x2A = 42
+ {0x17, 7}, // 0x2B = 43
+ {0x19, 9}, // 0x2C = 44
+ {0x1E, 11}, // 0x2D = 45
+ {0x1B, 10}, // 0x2E = 46
+ {0x07, 4}, // 0x2F = 47
+ {0x03, 2}, // 0x30 = 48
+ {0x07, 4}, // 0x31 = 49
+ {0x07, 4}, // 0x32 = 50
+ {0x0F, 5}, // 0x33 = 51
+ {0x19, 9}, // 0x34 = 52
+ {0x1B, 10}, // 0x35 = 53
+ {0x1E, 11}, // 0x36 = 54
+ {0x07, 4}, // 0x37 = 55
+ {0x19, 9}, // 0x38 = 56
+ {0x1E, 11}, // 0x39 = 57
+ {0x1B, 10}, // 0x3A = 58
+ {0x07, 4}, // 0x3B = 59
+ {0x3C, 12}, // 0x3C = 60
+ {0x19, 9}, // 0x3D = 61
+ {0x19, 9}, // 0x3E = 62
+ {0x03, 2}, // 0x3F = 63
+ {0x01, 1}, // 0x40 = 64
+ {0x06, 3}, // 0x41 = 65
+ {0x18, 8}, // 0x42 = 66
+ {0x19, 9}, // 0x43 = 67
+ {0x03, 2}, // 0x44 = 68
+ {0x07, 4}, // 0x45 = 69
+ {0x19, 9}, // 0x46 = 70
+ {0x1B, 10}, // 0x47 = 71
+ {0x06, 3}, // 0x48 = 72
+ {0x16, 6}, // 0x49 = 73
+ {0x19, 9}, // 0x4A = 74
+ {0x1E, 11}, // 0x4B = 75
+ {0x07, 4}, // 0x4C = 76
+ {0x17, 7}, // 0x4D = 77
+ {0x1B, 10}, // 0x4E = 78
+ {0x07, 4}, // 0x4F = 79
+ {0x03, 2}, // 0x50 = 80
+ {0x07, 4}, // 0x51 = 81
+ {0x19, 9}, // 0x52 = 82
+ {0x1B, 10}, // 0x53 = 83
+ {0x07, 4}, // 0x54 = 84
+ {0x0F, 5}, // 0x55 = 85
+ {0x1E, 11}, // 0x56 = 86
+ {0x07, 4}, // 0x57 = 87
+ {0x19, 9}, // 0x58 = 88
+ {0x1E, 11}, // 0x59 = 89
+ {0x3C, 12}, // 0x5A = 90
+ {0x19, 9}, // 0x5B = 91
+ {0x1B, 10}, // 0x5C = 92
+ {0x07, 4}, // 0x5D = 93
+ {0x19, 9}, // 0x5E = 94
+ {0x03, 2}, // 0x5F = 95
+ {0x06, 3}, // 0x60 = 96
+ {0x16, 6}, // 0x61 = 97
+ {0x19, 9}, // 0x62 = 98
+ {0x1E, 11}, // 0x63 = 99
+ {0x19, 9}, // 0x64 = 100
+ {0x1E, 11}, // 0x65 = 101
+ {0x3C, 12}, // 0x66 = 102
+ {0x19, 9}, // 0x67 = 103
+ {0x16, 6}, // 0x68 = 104
+ {0x69, 13}, // 0x69 = 105
+ {0x1E, 11}, // 0x6A = 106
+ {0x16, 6}, // 0x6B = 107
+ {0x1E, 11}, // 0x6C = 108
+ {0x16, 6}, // 0x6D = 109
+ {0x19, 9}, // 0x6E = 110
+ {0x06, 3}, // 0x6F = 111
+ {0x07, 4}, // 0x70 = 112
+ {0x17, 7}, // 0x71 = 113
+ {0x1B, 10}, // 0x72 = 114
+ {0x07, 4}, // 0x73 = 115
+ {0x1B, 10}, // 0x74 = 116
+ {0x07, 4}, // 0x75 = 117
+ {0x19, 9}, // 0x76 = 118
+ {0x03, 2}, // 0x77 = 119
+ {0x1E, 11}, // 0x78 = 120
+ {0x16, 6}, // 0x79 = 121
+ {0x19, 9}, // 0x7A = 122
+ {0x06, 3}, // 0x7B = 123
+ {0x19, 9}, // 0x7C = 124
+ {0x06, 3}, // 0x7D = 125
+ {0x18, 8}, // 0x7E = 126
+ {0x01, 1}, // 0x7F = 127
+ {0x01, 1}, // 0x80 = 128
+ {0x18, 8}, // 0x81 = 129
+ {0x06, 3}, // 0x82 = 130
+ {0x19, 9}, // 0x83 = 131
+ {0x06, 3}, // 0x84 = 132
+ {0x19, 9}, // 0x85 = 133
+ {0x16, 6}, // 0x86 = 134
+ {0x1E, 11}, // 0x87 = 135
+ {0x03, 2}, // 0x88 = 136
+ {0x19, 9}, // 0x89 = 137
+ {0x07, 4}, // 0x8A = 138
+ {0x1B, 10}, // 0x8B = 139
+ {0x07, 4}, // 0x8C = 140
+ {0x1B, 10}, // 0x8D = 141
+ {0x17, 7}, // 0x8E = 142
+ {0x07, 4}, // 0x8F = 143
+ {0x06, 3}, // 0x90 = 144
+ {0x19, 9}, // 0x91 = 145
+ {0x16, 6}, // 0x92 = 146
+ {0x1E, 11}, // 0x93 = 147
+ {0x16, 6}, // 0x94 = 148
+ {0x1E, 11}, // 0x95 = 149
+ {0x69, 13}, // 0x96 = 150
+ {0x16, 6}, // 0x97 = 151
+ {0x19, 9}, // 0x98 = 152
+ {0x3C, 12}, // 0x99 = 153
+ {0x1E, 11}, // 0x9A = 154
+ {0x19, 9}, // 0x9B = 155
+ {0x1E, 11}, // 0x9C = 156
+ {0x19, 9}, // 0x9D = 157
+ {0x16, 6}, // 0x9E = 158
+ {0x06, 3}, // 0x9F = 159
+ {0x03, 2}, // 0xA0 = 160
+ {0x19, 9}, // 0xA1 = 161
+ {0x07, 4}, // 0xA2 = 162
+ {0x1B, 10}, // 0xA3 = 163
+ {0x19, 9}, // 0xA4 = 164
+ {0x3C, 12}, // 0xA5 = 165
+ {0x1E, 11}, // 0xA6 = 166
+ {0x19, 9}, // 0xA7 = 167
+ {0x07, 4}, // 0xA8 = 168
+ {0x1E, 11}, // 0xA9 = 169
+ {0x0F, 5}, // 0xAA = 170
+ {0x07, 4}, // 0xAB = 171
+ {0x1B, 10}, // 0xAC = 172
+ {0x19, 9}, // 0xAD = 173
+ {0x07, 4}, // 0xAE = 174
+ {0x03, 2}, // 0xAF = 175
+ {0x07, 4}, // 0xB0 = 176
+ {0x1B, 10}, // 0xB1 = 177
+ {0x17, 7}, // 0xB2 = 178
+ {0x07, 4}, // 0xB3 = 179
+ {0x1E, 11}, // 0xB4 = 180
+ {0x19, 9}, // 0xB5 = 181
+ {0x16, 6}, // 0xB6 = 182
+ {0x06, 3}, // 0xB7 = 183
+ {0x1B, 10}, // 0xB8 = 184
+ {0x19, 9}, // 0xB9 = 185
+ {0x07, 4}, // 0xBA = 186
+ {0x03, 2}, // 0xBB = 187
+ {0x19, 9}, // 0xBC = 188
+ {0x18, 8}, // 0xBD = 189
+ {0x06, 3}, // 0xBE = 190
+ {0x01, 1}, // 0xBF = 191
+ {0x03, 2}, // 0xC0 = 192
+ {0x19, 9}, // 0xC1 = 193
+ {0x19, 9}, // 0xC2 = 194
+ {0x3C, 12}, // 0xC3 = 195
+ {0x07, 4}, // 0xC4 = 196
+ {0x1B, 10}, // 0xC5 = 197
+ {0x1E, 11}, // 0xC6 = 198
+ {0x19, 9}, // 0xC7 = 199
+ {0x07, 4}, // 0xC8 = 200
+ {0x1E, 11}, // 0xC9 = 201
+ {0x1B, 10}, // 0xCA = 202
+ {0x19, 9}, // 0xCB = 203
+ {0x0F, 5}, // 0xCC = 204
+ {0x07, 4}, // 0xCD = 205
+ {0x07, 4}, // 0xCE = 206
+ {0x03, 2}, // 0xCF = 207
+ {0x07, 4}, // 0xD0 = 208
+ {0x1B, 10}, // 0xD1 = 209
+ {0x1E, 11}, // 0xD2 = 210
+ {0x19, 9}, // 0xD3 = 211
+ {0x17, 7}, // 0xD4 = 212
+ {0x07, 4}, // 0xD5 = 213
+ {0x16, 6}, // 0xD6 = 214
+ {0x06, 3}, // 0xD7 = 215
+ {0x1B, 10}, // 0xD8 = 216
+ {0x19, 9}, // 0xD9 = 217
+ {0x19, 9}, // 0xDA = 218
+ {0x18, 8}, // 0xDB = 219
+ {0x07, 4}, // 0xDC = 220
+ {0x03, 2}, // 0xDD = 221
+ {0x06, 3}, // 0xDE = 222
+ {0x01, 1}, // 0xDF = 223
+ {0x07, 4}, // 0xE0 = 224
+ {0x1E, 11}, // 0xE1 = 225
+ {0x1B, 10}, // 0xE2 = 226
+ {0x19, 9}, // 0xE3 = 227
+ {0x1B, 10}, // 0xE4 = 228
+ {0x19, 9}, // 0xE5 = 229
+ {0x19, 9}, // 0xE6 = 230
+ {0x18, 8}, // 0xE7 = 231
+ {0x17, 7}, // 0xE8 = 232
+ {0x16, 6}, // 0xE9 = 233
+ {0x07, 4}, // 0xEA = 234
+ {0x06, 3}, // 0xEB = 235
+ {0x07, 4}, // 0xEC = 236
+ {0x06, 3}, // 0xED = 237
+ {0x03, 2}, // 0xEE = 238
+ {0x01, 1}, // 0xEF = 239
+ {0x0F, 5}, // 0xF0 = 240
+ {0x07, 4}, // 0xF1 = 241
+ {0x07, 4}, // 0xF2 = 242
+ {0x03, 2}, // 0xF3 = 243
+ {0x07, 4}, // 0xF4 = 244
+ {0x03, 2}, // 0xF5 = 245
+ {0x06, 3}, // 0xF6 = 246
+ {0x01, 1}, // 0xF7 = 247
+ {0x07, 4}, // 0xF8 = 248
+ {0x06, 3}, // 0xF9 = 249
+ {0x03, 2}, // 0xFA = 250
+ {0x01, 1}, // 0xFB = 251
+ {0x03, 2}, // 0xFC = 252
+ {0x01, 1}, // 0xFD = 253
+ {0x01, 1}, // 0xFE = 254
+ {0x00, 0} // 0xFF = 255
+};
+
+
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis [Collect non-XOR inputs.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Acec_GenerateNpnTable()
+{
+ int Table[256], Classes[16], Map[256];
+ int i, k, nClasses = 0;
+ for ( i = 0; i < 256; i++ )
+ Table[i] = Extra_TruthCanonNPN( i, 3 );
+ for ( i = 0; i < 256; i++ )
+ {
+ printf( "{" );
+ Extra_PrintHex( stdout, &Table[i], 3 );
+ printf( ", " );
+ // find the class
+ for ( k = 0; k < nClasses; k++ )
+ if ( Table[i] == Classes[k] )
+ break;
+ if ( k == nClasses )
+ Classes[nClasses++] = Table[i];
+ Map[i] = k;
+ // print
+ printf( "%2d}, // ", k );
+ Extra_PrintHex( stdout, &i, 3 );
+ printf( " = %3d\n", i );
+ }
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Acec_StatsCollect( Gia_Man_t * p, int fVerbose )
+{
+ extern int Dar_LibReturnClass( unsigned uTruth );
+ extern char ** Kit_DsdNpn4ClassNames();
+ char ** pNames = Kit_DsdNpn4ClassNames();
+
+ int Map[256] = {0};
+ Vec_Wrd_t * vTruths = Vec_WrdStart( Gia_ManObjNum(p) );
+ Vec_Wrd_t * vTemp = Vec_WrdStart( Gia_ManObjNum(p) );
+ word Truth, TruthF;
+ int iTruth, iTruthF;
+ int iFan, iLut, i, k, Class;
+ assert( Gia_ManHasMapping(p) );
+ assert( Gia_ManLutSizeMax(p) < 4 );
+ // collect truth tables
+ Gia_ManForEachLut( p, iLut )
+ {
+ Truth = Gia_ObjComputeTruthTable6Lut( p, iLut, vTemp );
+ Vec_WrdWriteEntry( vTruths, iLut, Truth );
+ }
+ Vec_WrdFree( vTemp );
+ // collect pairs
+ Gia_ManForEachLut( p, iLut )
+ {
+ Truth = Vec_WrdEntry( vTruths, iLut ) & 0xFF;
+ iTruth = Npn3Table[Truth][1];
+ assert( iTruth < 15 );
+ Gia_LutForEachFanin( p, iLut, iFan, k )
+ {
+ TruthF = Vec_WrdEntry( vTruths, iFan ) & 0xFF;
+ iTruthF = Npn3Table[TruthF][1];
+ assert( iTruthF < 15 );
+ Map[(iTruthF << 4) + iTruth]++;
+ }
+ }
+ Gia_ManForEachCoDriverId( p, iFan, k )
+ {
+ TruthF = Vec_WrdEntry( vTruths, iFan );
+ iTruthF = Npn3Table[TruthF & 0xFF][1];
+ assert( iTruthF < 15 );
+ Map[(iTruthF << 4)]++;
+ }
+ Vec_WrdFree( vTruths );
+ // print statistics
+ printf( "fi / fo" );
+ for ( i = 0; i < 14; i++ )
+ printf( "%6d ", i );
+ printf( "\n" );
+ for ( i = 0; i < 14; i++ )
+ {
+ printf( "%6d ", i );
+ for ( k = 0; k < 14; k++ )
+ if ( Map[(i << 4) | k] )
+ printf( "%6d ", Map[(i << 4) | k] );
+ else
+ printf( "%6s ", "." );
+ printf( "\n" );
+ }
+ // print class formulas
+ printf( "\nClasses:\n" );
+ for ( i = 0; i < 14; i++ )
+ {
+ for ( k = 0; k < 256; k++ )
+ if ( Npn3Table[k][1] == i )
+ break;
+ assert( k < 256 );
+ Class = Dar_LibReturnClass( (Npn3Table[k][0] << 8) | Npn3Table[k][0] );
+ printf( "%2d : %s\n", i, pNames[Class] );
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
+ABC_NAMESPACE_IMPL_END
+