#include <netlist.h>
Collaboration diagram for NetListType:
Public Member Functions | |
NetListType (ifstream &infile_pl, ifstream &infile_nets, const HardBlockInfoType &blockinfo) | |
double | getHPWL (const OrientedPacking &pk) const |
Public Attributes | |
const vector< NetType > & | nets |
const vector< PadInfoType > & | padinfo |
Private Member Functions | |
void | ParsePl (ifstream &infile, const HardBlockInfoType &blockinfo) |
void | ParseNets (ifstream &infile, const HardBlockInfoType &blockinfo) |
void | get_index (const string &name, vector< int > &indices) const |
int | get_index (const string &name, const HardBlockInfoType &blockinfo) const |
NetListType (const NetListType &) | |
Private Attributes | |
vector< NetType > | in_nets |
vector< PadInfoType > | in_all_pads |
|
Definition at line 130 of file netlist.h. References ParseNets(), and ParsePl().
|
Here is the call graph for this function:
|
|
|
Definition at line 155 of file netlist.h. References HardBlockInfoType::block_names, and HardBlockInfoType::blocknum().
00157 { 00158 for (int i = 0; i < blockinfo.blocknum(); i++) 00159 if (name == blockinfo.block_names[i]) 00160 return i; 00161 return -1; 00162 } |
Here is the call graph for this function:
|
Definition at line 164 of file netlist.h. References in_all_pads. Referenced by ParseNets().
00166 { 00167 indices.clear(); 00168 for (unsigned int i = 0; i < in_all_pads.size(); i++) 00169 { 00170 const string& this_pad_name = in_all_pads[i].pad_name; 00171 int pos = this_pad_name.find(name, 0); 00172 if (pos == 0) 00173 { 00174 if (this_pad_name.length() == name.length()) 00175 indices.push_back(i); 00176 else if (this_pad_name[name.length()] == '@') 00177 indices.push_back(i); 00178 } 00179 } 00180 } |
|
Definition at line 140 of file netlist.h. References in_nets.
00141 { 00142 int num_nets = in_nets.size(); 00143 double HPWL = 0; 00144 for (int i = 0; i < num_nets; i++) 00145 { 00146 // printf("---Net [%d]---\n", i); 00147 HPWL += in_nets[i].getHPWL(pk); 00148 // cout.setf(ios::fixed); 00149 // cout.precision(2); 00150 // cout << HPWL << endl << endl; 00151 } 00152 return HPWL; 00153 } |
|
Definition at line 136 of file netlist.cxx. References NetType::PinType::block, get_index(), in_all_pads, in_nets, NetType::PinType::x_offset, NetType::PadType::xloc, NetType::PinType::y_offset, and NetType::PadType::yloc. Referenced by NetListType().
00138 { 00139 string line; 00140 int numNets = -1; 00141 int numPins = -1; 00142 if(!infile.good()) 00143 { 00144 cout << "ERROR: .nets file could not be opened successfully" << endl; 00145 exit(1); 00146 } 00147 00148 // get NumNets 00149 getline(infile, line); 00150 while(getline(infile, line)) 00151 { 00152 char first_word[100]; 00153 char ch; 00154 00155 if ((sscanf(line.c_str(), "%s %c %d", 00156 first_word, &ch, &numNets) == 3) && 00157 !strcmp(first_word, "NumNets")) 00158 break; 00159 00160 } 00161 00162 if (!infile.good()) 00163 { 00164 cout << "ERROR in reading .net file (# nets)." << endl; 00165 exit(1); 00166 } 00167 00168 // get NumPins 00169 while(getline(infile, line)) 00170 { 00171 char first_word[100]; 00172 char ch; 00173 00174 if ((sscanf(line.c_str(), "%s %c %d", 00175 first_word, &ch, &numPins) == 3) && 00176 !strcmp(first_word, "NumPins")) 00177 break; 00178 } 00179 00180 if (!infile.good()) 00181 { 00182 cout << "ERROR in reading .net file (# pins)." << endl; 00183 exit(1); 00184 } 00185 00186 00187 // parse the contents of the nets 00188 int netDegree = -1; // degree of the current net 00189 int degreeCount = 0; 00190 int pinCount = 0; 00191 vector<NetType::PadType> netPads; // vector of pads for the current net; 00192 vector<NetType::PinType> netPins; // vector of pins for the current net; 00193 for (int lineCount = 0; infile.good(); lineCount++) 00194 { 00195 char dummy_word[1000]; 00196 char block_name[1000]; 00197 char dummy_chars[100]; 00198 int number; 00199 double x_percent, y_percent; 00200 00201 getline(infile, line); 00202 if (sscanf(line.c_str(), "%s", dummy_word) < 1) 00203 { 00204 // blank line 00205 if (infile.eof()) 00206 { 00207 // wrap up the last net. 00208 int degreeCount = netPins.size() + netPads.size(); 00209 if (degreeCount == netDegree) 00210 { 00211 NetType temp(netPins, netPads); 00212 in_nets.push_back(temp); 00213 00214 degreeCount = 0; 00215 netPins.clear(); 00216 netPads.clear(); 00217 } 00218 else 00219 { 00220 printf("ERROR: netDegree in net %d does not tally\n", 00221 in_nets.size()); 00222 exit(1); 00223 } 00224 } 00225 } 00226 else if ((sscanf(line.c_str(), "%c", dummy_chars+0) == 1) && 00227 dummy_chars[0] == '#') 00228 { /* comments (starts with '#') */ } 00229 else if (sscanf(line.c_str(), "%s %c %c %c%lf %c%lf", 00230 block_name, dummy_chars+0, dummy_chars+1, 00231 dummy_chars+2, &x_percent, 00232 dummy_chars+3, &y_percent) == 7) 00233 { 00234 // consider a pin, on the block "block_name". 00235 int index = get_index(string(block_name), blockinfo); 00236 if (index == -1) 00237 { 00238 printf("ERROR: Unrecognized block \"%s\"\n", block_name); 00239 exit(1); 00240 } 00241 else 00242 { 00243 x_percent /= 100; 00244 y_percent /= 100; 00245 00246 NetType::PinType temp; 00247 temp.block = index; 00248 temp.x_offset = (blockinfo[index].width[0] * x_percent) / 2; 00249 temp.y_offset = (blockinfo[index].height[0] * y_percent) / 2; 00250 // printf("block %d: x_offset: %.2lf y_offset: %.2lf width: %.2lf height: %2.lf\n", 00251 // index, temp.x_offset, temp.y_offset, 00252 // blockinfo[index].width[0], blockinfo[index].height[0]); 00253 netPins.push_back(temp); 00254 degreeCount++; 00255 pinCount++; 00256 } 00257 } 00258 else if (sscanf(line.c_str(), "%s %c %d", 00259 dummy_word, dummy_chars+0, &number) == 3) 00260 { 00261 if (!strcmp(dummy_word, "NetDegree")) 00262 { 00263 // see "NetDegree : x, wrap up previous net 00264 if (netDegree == -1) 00265 netDegree = number; 00266 else if (degreeCount == netDegree) 00267 { 00268 NetType temp(netPins, netPads); 00269 in_nets.push_back(NetType(netPins, netPads)); 00270 00271 netDegree = number; 00272 degreeCount = 0; 00273 netPins.clear(); 00274 netPads.clear(); 00275 } 00276 else 00277 { 00278 printf("ERROR: netDegree in net %d does not tally (%d vs. %d).\n", 00279 in_nets.size(), degreeCount, netDegree); 00280 exit(1); 00281 } 00282 } 00283 else 00284 { 00285 printf("ERROR in parsing .net file (line %d after NumPins).\n", 00286 lineCount+1); 00287 printf("line: %s\n", line.c_str()); 00288 exit(1); 00289 } 00290 } 00291 else if (sscanf(line.c_str(), "%s %c", 00292 block_name, dummy_chars+0) == 2) 00293 { 00294 // consider a pad, with name "block_name". 00295 vector<int> indices; 00296 get_index(string(block_name), indices); 00297 if (indices.empty()) 00298 { 00299 printf("ERROR: unrecognized pad \"%s\"\n", block_name); 00300 exit(1); 00301 } 00302 else 00303 { 00304 for (unsigned int i = 0; i < indices.size(); i++) 00305 { 00306 NetType::PadType temp; 00307 temp.xloc = in_all_pads[indices[i]].xloc; 00308 temp.yloc = in_all_pads[indices[i]].yloc; 00309 netPads.push_back(temp); 00310 pinCount++; 00311 } 00312 degreeCount++; 00313 } 00314 00315 } 00316 else 00317 { 00318 printf("ERROR in parsing .net file (line %d after NumPins).\n", 00319 lineCount+1); 00320 printf("line: %s\n", line.c_str()); 00321 exit(1); 00322 } 00323 } 00324 00325 if (pinCount != numPins) 00326 { 00327 printf("ERROR: # pins does not tally (%d vs. %d).", 00328 pinCount, numPins); 00329 exit(1); 00330 } 00331 else if (int(in_nets.size()) != numNets) 00332 { 00333 printf("ERROR: # nets does not tally (%d vz. %d).", 00334 in_nets.size(), numNets); 00335 exit(1); 00336 } 00337 infile.close(); 00338 } |
Here is the call graph for this function:
|
Definition at line 102 of file netlist.cxx. References HardBlockInfoType::blocknum(), in_all_pads, NetListType::PadInfoType::pad_name, NetListType::PadInfoType::xloc, and NetListType::PadInfoType::yloc. Referenced by NetListType().
00104 { 00105 in_all_pads.clear(); 00106 00107 ofstream outfile; 00108 outfile.open("dummy_pl"); 00109 00110 string line; 00111 int objCount = 0; 00112 for (int lineCount = 0; 00113 getline(infile, line); lineCount++) 00114 { 00115 char name[100]; 00116 double xloc, yloc; 00117 00118 outfile << line << endl; 00119 if (sscanf(line.c_str(), "%s %lf %lf", 00120 name, &xloc, &yloc) == 3) 00121 { 00122 if (objCount >= blockinfo.blocknum()) 00123 { 00124 PadInfoType temp_pad; 00125 temp_pad.pad_name = name; 00126 temp_pad.xloc = xloc; 00127 temp_pad.yloc = yloc; 00128 00129 in_all_pads.push_back(temp_pad); 00130 } 00131 objCount++; 00132 } 00133 } 00134 } |
Here is the call graph for this function:
|
Definition at line 112 of file netlist.h. Referenced by get_index(), ParseNets(), and ParsePl(). |
|
Definition at line 111 of file netlist.h. Referenced by getHPWL(), and ParseNets(). |
|
|
|
|