-
Notifications
You must be signed in to change notification settings - Fork 0
/
ckt2bench.cc~
170 lines (143 loc) · 4.31 KB
/
ckt2bench.cc~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <set>
#include <vector>
#include <map>
#include <math.h>
#include <cassert>
#include <ctime>
#include <sys/timeb.h>
#include "class/CircuitNode.h"
#include "class/CircuitLine.h"
#include "class/FaultList.h"
#include "class/TestList.h"
#include "lib/file_operations.h"
#include "lib/radix_convert.h"
#include "function/read_circuit_v2.h"
#include "function/print_circuit.h"
#include "function/copy_point_vector.h"
#include "function/write_bench.h"
#ifndef GLOBAL_DEFINES_H_
#include "include/global_defines.h"
#endif
vector<int> inputList;
vector<int> outputList;
using namespace std;
int check_inv_chain(map<int, CircuitNode> &orNodeList)
{
map<int, CircuitNode>::iterator itrm, itrm1, itrm2, itrm3, itrm4;
vector<CircuitNode*>::iterator itrv, itrv1, itrv2, itrv3, itrv4;
int count_minus = 0;
vector<int> delete_set;
for(itrm = orNodeList.begin(); itrm != orNodeList.end(); itrm++)
{
int count_inv = 0;
if(itrm->second.gateType == 5)
{
int fanout_not_inv = 0;
if(itrm->second.pointFanOut.size() == 1)
{
itrv1 = itrm->second.pointFanOut.begin();
itrm1 = orNodeList.find((*itrv1)->lineNumber);
if(itrm1->second.gateType != 5)
fanout_not_inv = 1;
}
else if(itrm->second.pointFanOut.size() > 1)
fanout_not_inv = 1;
if(fanout_not_inv == 0)
continue;
count_inv++;
vector<int> inv_set;
inv_set.push_back(itrm->second.lineNumber);
itrv2 = itrm->second.pointFanIn.begin();
itrm2 = orNodeList.find((*itrv2)->lineNumber);
int gate_type = itrm2->second.gateType;
int current_node = itrm2->second.lineNumber;
while(gate_type == 5)
{
// redFILE1 << current_node << " ";
inv_set.push_back(current_node);
itrm3 = orNodeList.find(current_node);
itrv4 = itrm3->second.pointFanIn.begin();
itrm4 = orNodeList.find((*itrv4)->lineNumber);
gate_type = itrm4->second.gateType;
current_node = itrm4->second.lineNumber;
count_inv++;
}
if(count_inv % 2 == 0)
count_minus += count_inv;
else
count_minus = count_minus + count_inv - 1;
if(inv_set.size() >= 2)
{
if(inv_set.size() % 2 == 0)
delete_set.insert(delete_set.begin(), inv_set.begin(), inv_set.end());
else
{
vector<int>::iterator iv;
iv = inv_set.begin();
inv_set.erase(iv);
delete_set.insert(delete_set.begin(), inv_set.begin(), inv_set.end());
}
}
}
}
for(int i = 0; i < delete_set.size(); i++)
{
int node = delete_set[i];
itrm = orNodeList.find(node);
if(itrm != orNodeList.end())
{
remove_inv(orNodeList, node);
// redFILE1 << "remove inv: "<<node<<endl;
}
}
int final_size = orNodeList.size();
// int final_size = orNodeList.size() - count_minus;
return final_size;
}
int main(int argc, char *argv[])
{
//Containers for circuits
map<int, CircuitNode> orNodeList_m;
map<int, CircuitNode> brNodeList_m;
map<int, CircuitNode> masterNodeList_m;
//Iterators
vector<CircuitNode>::iterator itrv;
vector<CircuitNode*>::iterator itrv1;
set<int>::iterator itrs;
map<int, CircuitNode>::iterator itrm, itrm1, itrm2, itrm3, itrm4;
//Check the number of arguments
if (argc != 2)
{
cerr << "ERROR: Usage: " << argv[0] << " <Circuit1 Filename> "<< endl;
exit(1);
}
//Read the original circuit, the BR circuit and the BR pla file.
ifstream inFile1;
string fileName1 = argv[1];
inFile1.open(fileName1.c_str(), ios::in);
if(!inFile1)
{
cerr << "Cannot open file "<<fileName1<<endl;
exit(1);
}
ReadCircuit_v2(inFile1, orNodeList_m, inputList, outputList, 1);
inFile1.close();
int numPI = inputList.size();
int numPO = outputList.size();
cout <<"# PI: "<<numPI<<endl;
cout <<"# PO: "<<numPO<<endl;
cout<< "Input list:"<<endl;
for(int i=0; i<inputList.size(); i++)
cout<<inputList[i]<<" ";
cout<<endl;
int final_size = check_inv_chain(orNodeList_m);
ofstream oufile;
string catname = "mtp";
write_bench_or(orNodeList_m, oufile, catname);
return 0;
}