00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "torc/packer/ParsePrimitive.hpp"
00017 #include "torc/packer/RcFactory.hpp"
00018 #include <stdarg.h>
00019
00020 namespace torc {
00021 namespace physical {
00022
00023
00024 static const char delimiters[] = " \n\t\f";
00025
00026 void ParsePrimitive::readCurrentLine() {
00027 static const unsigned initial_size = 1024;
00028
00029 if (!line) {
00030 lineSize = initial_size;
00031 line = new char[lineSize];
00032 }
00033
00034 unsigned offset = 0;
00035
00036 for (;;) {
00037
00038 if (!fgets(line + offset, lineSize - offset, inFile)) { if
00039 (ferror(inFile)) { perror("read error"); exit(1); } if (!offset)
00040 strcpy(line, ".end\n"); break; }
00041
00042 unsigned len = offset + strlen(line + offset);
00043
00044 if (line[len-1] == '\n') {
00045 ++lineNumber;
00046 if (line[len-2] == '\\') len -= 2; else break;
00047 }
00048 else {
00049 if (len != lineSize - 1) break;
00050
00051 char *new_line = new char[lineSize << 1];
00052 for (unsigned i = 0; i < lineSize; ++i)
00053 new_line[i] = line[i];
00054 delete [] line;
00055 line = new_line;
00056 lineSize <<= 1;
00057 }
00058
00059 offset = len;
00060 }
00061
00062 }
00063
00064 void ParsePrimitive::printError(const char *format, ...) {
00065 va_list args;
00066
00067 if (lineNumber)
00068 fprintf(stderr, "Parse printError in %s:%d: ", inFileName, lineNumber);
00069 else fprintf(stderr, "Parse printError: ");
00070
00071 va_start(args, format);
00072 vfprintf(stderr, format, args);
00073 va_end(args);
00074
00075 exit(1);
00076 }
00077
00078 PrimitiveSetSharedPtr ParsePrimitive::ParsePrimitiveFile(const char *name) {
00079
00080 inFileName = name;
00081
00082 lineNumber = 0;
00083 if (!(inFile = fopen(inFileName, "r")))
00084 printError("Cannot open file '%s'.\n", inFileName);
00085 lineNumber = 1;
00086
00087 int site_no, pin_no, element_no;
00088 string strTmp;
00089 string typeTmp;
00090 string compName;
00091 string element1;
00092 string element2;
00093 string PrimitivePin1;
00094 string PrimitivePin2;
00095
00096
00097 PrimitiveSetSharedPtr p;
00098
00099 readCurrentLine();
00100
00101 for (;;) {
00102 string token = strtok(line, delimiters);
00103 if (token[0] == '(') {
00104 if (token == "(xdl_resource_report") {
00105 string model = strtok(NULL, delimiters);
00106 model = strtok(NULL, delimiters);
00107 p = RcFactory::newPrimitiveSetPtr(model);
00108 readCurrentLine();
00109 continue;
00110 }
00111 else
00112 if (token =="(tiles") {
00113 readCurrentLine();
00114 continue;
00115 }
00116 else
00117 if (token =="(tile") {
00118 for(int i=0; i<5; ++i)
00119 strTmp = strtok(NULL, delimiters);
00120 site_no = atoi(strTmp.c_str());
00121 for(int i=0; i<site_no; ++i)
00122 readCurrentLine();
00123 readCurrentLine();
00124 continue;
00125 }
00126 else
00127 if (token == "(primitive_defs") {
00128 readCurrentLine();
00129 continue;
00130 }
00131 else
00132 if (token == "(primitive_def") {
00133 compName = strtok(NULL, delimiters);
00134 strTmp = strtok(NULL, delimiters);
00135 pin_no = atoi (strTmp.c_str());
00136 strTmp = strtok(NULL, delimiters);
00137 element_no=atoi(strTmp.c_str());
00138 PrimitiveSharedPtr pp = RcFactory::newPrimitivePtr(compName);
00139 p->addPrimitive(pp);
00140
00141 for(int i=0; i<pin_no; ++i){
00142 readCurrentLine();
00143 strTmp = strtok(line, delimiters);
00144 strTmp = strtok(NULL, delimiters);
00145 compName = strtok(NULL, delimiters);
00146 typeTmp = strtok(NULL, delimiters);
00147 typeTmp.resize(typeTmp.length() - 1);
00148 PrimitivePinSharedPtr newPrimitivePin = RcFactory::newPrimitivePinPtr (strTmp, compName, ((typeTmp == "input") ? InputP : OutputP));
00149 pp->addPrimitivePin(newPrimitivePin);
00150 }
00151
00152 for(int i=0; i<element_no; ++i){
00153 readCurrentLine();
00154 strTmp = strtok(line, delimiters);
00155 compName = strtok(NULL, delimiters);
00156 strTmp = strtok(NULL, delimiters);
00157 pin_no = atoi(strTmp.c_str());
00158 ElementSharedPtr ep = RcFactory::newElementPtr(compName);
00159 pp->addElement(ep);
00160
00161
00162 for(int i=0; i<pin_no; ++i){
00163 readCurrentLine();
00164 strTmp = strtok(line, delimiters);
00165 compName = strtok(NULL, delimiters);
00166 typeTmp = strtok(NULL, delimiters);
00167 typeTmp.resize(typeTmp.length() - 1);
00168 PrimitivePinSharedPtr newPrimitivePin = RcFactory::newPrimitivePinPtr (strTmp, compName, ((typeTmp == "input") ? InputP : OutputP));
00169 ep->addPrimitivePin(newPrimitivePin);
00170 }
00171 readCurrentLine();
00172 strTmp = strtok(line, delimiters);
00173
00174
00175 if (strTmp == "(cfg"){
00176 for(;;){
00177 string confTmp = strtok(NULL, delimiters);
00178 if(confTmp[confTmp.size()-1]==')'){
00179 confTmp.resize(confTmp.length() - 1);
00180 ep->addConfig(confTmp);
00181 break;
00182 }
00183 ep->addConfig(confTmp);
00184 }
00185 readCurrentLine();
00186
00187 strTmp = strtok(line, delimiters);
00188 }
00189
00190
00191 while(strTmp[0]!=')'){
00192 element1 = strtok(NULL, delimiters);
00193 PrimitivePin1 = strtok(NULL, delimiters);
00194 strTmp = strtok(NULL, delimiters);
00195 element2 = strtok(NULL, delimiters);
00196 PrimitivePin2 = strtok(NULL, delimiters);
00197 PrimitivePin2.resize(PrimitivePin2.length() - 1);
00198 if(strTmp == "<=="){
00199 swap(element1,element2);
00200 swap(PrimitivePin1,PrimitivePin2);
00201 }
00202
00203 ConnectionPin pin1 = RcFactory::newConnectionPin(element1,PrimitivePin1);
00204 ConnectionPin pin2 = RcFactory::newConnectionPin(element2,PrimitivePin2);
00205 ConnectionSharedPtr newConn = RcFactory::newConnectionPtr(line);
00206 newConn->addConnectionPin(pin1);
00207 newConn->addConnectionPin(pin2);
00208 ep->addConnection(newConn);
00209 readCurrentLine();
00210 strTmp = strtok(line, delimiters);
00211 }
00212
00213 }
00214 continue;
00215 }
00216 else
00217 if ((token == "(end") || (token == "(summary")){
00218 cout<<'(';
00219 for(int i=0; i<3; ++i){
00220 strTmp = strtok(NULL, delimiters);
00221 cout<<strTmp<<" ";
00222 }
00223 cout<<endl;
00224 break;
00225 }
00226 }
00227 else
00228 if (token[0] != '\n' && token[0] != '#' && token[0] != ')') printError("`.' expected.\n");
00229
00230 readCurrentLine();
00231 }
00232
00233 lineSize = 0;
00234 if (line) delete [] line;
00235 line = NULL;
00236 fclose(inFile);
00237
00238 return p;
00239 }
00240
00241 }
00242 }
00243