@@ -166,8 +166,15 @@ CirMgr::randomSim() {
166
166
void
167
167
CirMgr::fileSim (ifstream& patternFile) {
168
168
unsigned i, x, j, y;
169
+ string patIn;
169
170
vector<unsigned > dummyArr;
171
+ vector< vector<unsigned > > newFECG;
172
+ unsigned remainTime = 0 ;
173
+ size_t caseCount = 0 ;
174
+ unsigned * bl = CirGate::bitList;
175
+ unsigned * caseOut = new unsigned [param[2 ]];
170
176
CirGate** g = CirGate::gateArr;
177
+
171
178
if (!hasBeenSim) {
172
179
CirGate::FECGSet.push_back (vector<unsigned >());
173
180
CirGate::FECGSet[0 ].push_back (0 );
@@ -179,23 +186,46 @@ CirMgr::fileSim(ifstream& patternFile) {
179
186
g[i] = (CirGate*)(((size_t )g[i]) - 1 );
180
187
CirGate::flipped.pop_back ();
181
188
}
182
- if (CirGate::FECGSet[0 ].size () < 2 ) { CirGate::FECGSet.clear (); return ; }
189
+ if (CirGate::FECGSet[0 ].size () < 2 ) CirGate::FECGSet.clear ();
183
190
} else for (i = 0 , x = CirGate::FECGSet.size (); i < x; ++i)
184
191
for (j = 0 , y = CirGate::FECGSet[i].size (); j < y; ++j) {
185
192
CirGate::FECGSet[i][j] /= 2 ;
186
193
g[CirGate::FECGSet[i][j]]->FECNo = 0 ;
187
194
}
195
+
196
+ dummyArr.clear (); remainTime = 0 ;
197
+ while (patternFile >> patIn) {
198
+ x = patIn.size ();
199
+ if (x != param[1 ]) {
200
+ cout << " Error: Pattern(" << patIn << " ) length(" << x
201
+ << " ) does not match the number of inputs(" << param[1 ] << " ) in a circuit!!" << endl;
202
+ dummyArr.clear ();
203
+ caseCount = 0 ;
204
+ break ;
205
+ }
206
+ for (i = 0 ; i < x; ++i) if ((patIn[i] != ' 0' ) && (patIn[i] != ' 1' )) {
207
+ cout << " Error: Pattern(" << patIn << " ) contains a non-0/1 character(\' "
208
+ << patIn[i] << " \' )." << endl;
209
+ dummyArr.clear ();
210
+ caseCount = 0 ;
211
+ remainTime = 1 ;
212
+ break ;
213
+ }
214
+ if (remainTime) break ;
215
+
216
+ ++caseCount;
217
+ if (caseCount % 32 == 1 ) {
218
+ j = 1 ;
219
+ for (i = 0 ; i < x; ++i) dummyArr.push_back ((unsigned )(patIn[i] - ' 0' ));
220
+ } else {
221
+ j = j << 1 ;
222
+ for (i = 0 ; i < x; ++i) if (patIn[i] == ' 1' ) dummyArr[dummyArr.size () - x + i] += j;
223
+ }
188
224
189
- vector< vector<unsigned > > newFECG;
190
- unsigned remainTime = 0 ;
191
- size_t caseCount = 0 ;
192
- unsigned * bl = CirGate::bitList;
193
- unsigned * caseIn = new unsigned [param[1 ]];
194
- unsigned * caseOut = new unsigned [param[2 ]];
195
- while ((CirGate::FECGSet.size ()) && (remainTime < 5 )) {
196
- caseGen (caseIn, param[1 ]);
197
- caseCount += 32 ;
198
- for (i = 0 , x = param[1 ]; i < x; ++i) bl[PIList[i]] = caseIn[i];
225
+ }
226
+
227
+ for (unsigned k = 0 , z = dummyArr.size (), l = param[1 ]; k < z; k += l) {
228
+ for (i = 0 ; i < l; ++i) bl[PIList[i]] = dummyArr[k + i];
199
229
for (i = param[0 ] + 1 , x = i + param[2 ], j = 0 ; i < x; ++i, ++j) {
200
230
bitSim (i);
201
231
caseOut[j] = bl[i];
@@ -206,16 +236,15 @@ CirMgr::fileSim(ifstream& patternFile) {
206
236
CirGate::flipped.pop_back ();
207
237
}
208
238
if (_simLog) for (i = 0 ; i < 32 ; ++i) {
209
- for (j = 0 , y = param[ 1 ] ; j < y ; ++j) { (*_simLog) << (caseIn[ j] % 2 ); caseIn[ j] /= 2 ; }
239
+ for (j = 0 ; j < l ; ++j) { (*_simLog) << (dummyArr[k + j] % 2 ); dummyArr[k + j] /= 2 ; }
210
240
(*_simLog) << ' ' ;
211
241
for (j = 0 , y = param[2 ]; j < y; ++j) { (*_simLog) << (caseOut[j] % 2 ); caseOut[j] /= 2 ; }
212
242
(*_simLog) << endl;
213
243
}
214
244
215
245
y = 0 ; // changeExist
216
246
for (i = 0 , x = CirGate::FECGSet.size (); i < x; ++i) if (FECGHash (i, newFECG)) ++y;
217
- if (y) { remainTime = 0 ; CirGate::FECGSet.swap (newFECG); }
218
- else ++remainTime;
247
+ if (y) CirGate::FECGSet.swap (newFECG);
219
248
newFECG.clear ();
220
249
}
221
250
@@ -237,7 +266,6 @@ CirMgr::fileSim(ifstream& patternFile) {
237
266
238
267
hasBeenSim = true ;
239
268
delete [] caseOut;
240
- delete [] caseIn;
241
269
cout << caseCount << " patterns simulated." << endl;
242
270
}
243
271
0 commit comments