00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "torc/architecture/Sites.hpp"
00020 #include <iostream>
00021
00022 namespace torc {
00023 namespace architecture {
00024
00025 size_t Sites::readPackages(DigestStream& inStream) {
00026
00027 size_t bytesReadOffset = inStream.getBytesRead();
00028 char scratch[1 << 10];
00029 uint16_t nameLength = 0;
00030 PackageCount packageCount;
00031 PadCount padCount;
00032 SiteFlags siteFlags;
00033 SiteIndex siteIndex;
00034
00035
00036 string sectionName;
00037 inStream.readSectionHeader(sectionName);
00038
00039 if(sectionName != ">>>>Packages>>>>") throw -1;
00040
00041
00042 inStream.read(packageCount);
00043 mPackages.setSize(packageCount);
00044 std::cout << "\tReading " << packageCount << " package" << (packageCount != 1 ? "s" : "")
00045 << " (";
00046
00047 for(PackageIndex i; i < packageCount; i++) {
00048
00049 Package& package = const_cast<Package&>(mPackages[i]);
00050
00051 inStream.read(nameLength);
00052
00053 if(nameLength > sizeof(scratch)) throw -1;
00054 inStream.read(scratch, nameLength);
00055 scratch[nameLength] = 0;
00056
00057 package.mName = scratch;
00058 mPackageNameToPackageIndex[scratch] = i;
00059 std::cout << scratch << (i + 1 < packageCount ? ", " : "");
00060
00061 inStream.read(padCount);
00062 package.mPads.setSize(padCount);
00063
00064 for(PadCount j; j < padCount; j++) {
00065
00066 Pad& pad = const_cast<Pad&>(package.mPads[j]);
00067
00068 inStream.read(siteIndex);
00069
00070 inStream.read(siteFlags);
00071
00072 inStream.read(nameLength);
00073
00074 if(nameLength > sizeof(scratch)) throw -1;
00075 inStream.read(scratch, nameLength);
00076 scratch[nameLength] = 0;
00077
00078 pad.mSiteIndex = siteIndex;
00079 pad.mFlags = siteFlags;
00080 pad.mName = scratch;
00081 package.mPadNameToPadIndex[scratch] = xilinx::PadIndex(j);
00082 }
00083 }
00084 std::cout << ") ..." << std::endl;
00085
00086
00087 return inStream.getBytesRead() - bytesReadOffset;
00088 }
00089
00090 size_t Sites::readPrimitiveTypes(DigestStream& inStream) {
00091
00092 size_t bytesReadOffset = inStream.getBytesRead();
00093 char scratch[1 << 10];
00094 uint16_t nameLength = 0;
00095 SiteTypeCount siteTypeCount;
00096 uint32_t elementCount;
00097 PinCount pinCount;
00098 PinFlags pinFlags;
00099 uint32_t elementIndex;
00100 uint32_t pinIndex;
00101
00102
00103 string sectionName;
00104 inStream.readSectionHeader(sectionName);
00105
00106 if(sectionName != ">>>>PrimDefs>>>>") throw -1;
00107
00108
00109 inStream.read(siteTypeCount);
00110 mSiteTypes.setSize(siteTypeCount);
00111 std::cout << "\tReading " << siteTypeCount << " site types..." << std::endl;
00112
00113 for(SiteTypeIndex i; i < siteTypeCount; i++) {
00114
00115 PrimitiveDef& primitiveDef = const_cast<PrimitiveDef&>(mSiteTypes[i]);
00116
00117 inStream.read(nameLength);
00118
00119 if(nameLength > sizeof(scratch)) throw -1;
00120 inStream.read(scratch, nameLength);
00121 scratch[nameLength] = 0;
00122
00123
00124
00125 inStream.read(pinCount);
00126
00127 primitiveDef.mName = scratch;
00128 primitiveDef.mPins.setSize(pinCount);
00129
00130 for(PinCount j; j < pinCount; j++) {
00131
00132 PrimitivePin& primitivePin = const_cast<PrimitivePin&>(primitiveDef.mPins[j]);
00133
00134 inStream.read(pinFlags);
00135
00136 inStream.read(nameLength);
00137
00138 if(nameLength > sizeof(scratch)) throw -1;
00139 inStream.read(scratch, nameLength);
00140 scratch[nameLength] = 0;
00141
00142 primitivePin.mFlags = pinFlags;
00143 primitivePin.mName = scratch;
00144 primitiveDef.mPinNameToPinIndex[scratch] = xilinx::PinIndex(j);
00145 }
00146
00147 inStream.read(elementCount);
00148
00149 primitiveDef.mElements.setSize(elementCount);
00150
00151 for(uint32_t j = 0; j < elementCount; j++) {
00152
00153 PrimitiveElement& element
00154 = const_cast<PrimitiveElement&>(primitiveDef.mElements[j]);
00155
00156 inStream.read(nameLength);
00157
00158 if(nameLength > sizeof(scratch)) throw -1;
00159 inStream.read(scratch, nameLength);
00160 scratch[nameLength] = 0;
00161
00162 element.mName = scratch;
00163
00164
00165
00166 uint16_t isBel;
00167 inStream.read(isBel);
00168
00169 inStream.read(pinCount);
00170
00171 element.mIsBel = isBel != 0;
00172 element.mPins.setSize(pinCount);
00173
00174 for(PinCount k; k < pinCount; k++) {
00175
00176 PrimitiveElementPin& elementPin =
00177 const_cast<PrimitiveElementPin&>(element.mPins[k]);
00178
00179 inStream.read(pinFlags);
00180
00181 inStream.read(nameLength);
00182
00183 if(nameLength > sizeof(scratch)) throw -1;
00184 inStream.read(scratch, nameLength);
00185 scratch[nameLength] = 0;
00186
00187 elementPin.mElementPtr = &element;
00188
00189
00190
00191
00192
00193 elementPin.mFlags = pinFlags;
00194 elementPin.mName = scratch;
00195 element.mPinNameToPinIndex[scratch] = xilinx::PinIndex(k);
00196 }
00197
00198
00199 uint32_t cfgCount;
00200 inStream.read(cfgCount);
00201
00202
00203
00204 for(uint32_t k = 0; k < cfgCount; k++) {
00205
00206 inStream.read(nameLength);
00207
00208 if(nameLength > sizeof(scratch)) throw -1;
00209 inStream.read(scratch, nameLength);
00210 scratch[nameLength] = 0;
00211
00212
00213 element.mCfgs.insert(scratch);
00214 }
00215
00216 }
00217
00218 uint32_t connCount;
00219 inStream.read(connCount);
00220
00221
00222 primitiveDef.mConnections.setSize(connCount);
00223
00224 const PrimitiveElementArray& elements = primitiveDef.getElements();
00225 for(uint32_t j = 0; j < connCount; j++) {
00226
00227 PrimitiveConnSharedPtr& connectionPtr = primitiveDef.mConnections[j];
00228 connectionPtr = boost::shared_ptr<PrimitiveConn>(new PrimitiveConn());
00229 PrimitiveConn& connection = const_cast<PrimitiveConn&>(*connectionPtr);
00230
00231 uint16_t sourceCount;
00232 inStream.read(sourceCount);
00233
00234 if(sourceCount != 1) throw -1;
00235
00236 inStream.read(elementIndex);
00237 inStream.read(pinIndex);
00238 const PrimitiveElement* elementPtr = elements.begin() + elementIndex;
00239 PrimitiveElement& element = const_cast<PrimitiveElement&>(*elementPtr);
00240 const PrimitiveElementPinArray& pins = element.getPins();
00241 PrimitiveElementPin& pin = const_cast<PrimitiveElementPin&>(pins[pinIndex]);
00242 connection.mSourcePtr = &pin;
00243 const_cast<PrimitiveConnSharedPtr&>(pin.mPrimitiveConn) = connectionPtr;
00244
00245 uint16_t sinkCount;
00246 inStream.read(sinkCount);
00247
00248 for(uint32_t k = 0; k < sinkCount; k++) {
00249
00250 inStream.read(elementIndex);
00251 inStream.read(pinIndex);
00252 elementPtr = elements.begin() + elementIndex;
00253 PrimitiveElement& element = const_cast<PrimitiveElement&>(*elementPtr);
00254 const PrimitiveElementPinArray& pins = element.getPins();
00255 PrimitiveElementPin& pin = const_cast<PrimitiveElementPin&>(pins[pinIndex]);
00256 connection.mSinks.push_back(&pin);
00257 const_cast<PrimitiveConnSharedPtr&>(pin.mPrimitiveConn) = connectionPtr;
00258 }
00259 }
00260
00261 }
00262
00263
00264 return inStream.getBytesRead() - bytesReadOffset;
00265 }
00266
00267 size_t Sites::readPrimitivePinMaps(DigestStream& inStream) {
00268
00269 size_t bytesReadOffset = inStream.getBytesRead();
00270 uint16_t primitivePinMapCount = 0;
00271 PinCount pinCount;
00272 WireIndex wireIndex;
00273
00274
00275 string sectionName;
00276 inStream.readSectionHeader(sectionName);
00277
00278 if(sectionName != ">>>>Pin Maps>>>>") throw -1;
00279
00280
00281 inStream.read(primitivePinMapCount);
00282 mPrimitivePinMaps.setSize(primitivePinMapCount);
00283 std::cout << "\tReading " << primitivePinMapCount << " primitive pin maps..." << std::endl;
00284
00285 for(uint16_t i = 0; i < primitivePinMapCount; i++) {
00286
00287 inStream.read(pinCount);
00288 mPrimitivePinMaps[i].setSize(pinCount);
00289
00290 Array<const WireIndex>& pins = mPrimitivePinMaps[i];
00291
00292 for(PinCount j; j < pinCount; j++) {
00293
00294 WireIndex& pin = const_cast<WireIndex&>(pins[j]);
00295
00296 inStream.read(wireIndex);
00297 pin = wireIndex;
00298 }
00299 }
00300
00301
00302 return inStream.getBytesRead() - bytesReadOffset;
00303 }
00304
00305 size_t Sites::readSites(DigestStream& inStream) {
00306
00307 size_t bytesReadOffset = inStream.getBytesRead();
00308 char scratch[1 << 10];
00309 uint16_t nameLength = 0;
00310 SiteCount siteCount;
00311 SiteTypeIndex siteTypeIndex;
00312 TileIndex tileIndex;
00313 SiteFlags flags;
00314 uint16_t pinMap = 0;
00315
00316
00317 string sectionName;
00318 inStream.readSectionHeader(sectionName);
00319
00320 if(sectionName != ">>>> Sites >>>>") throw -1;
00321
00322
00323 inStream.read(siteCount);
00324 mSites.setSize(siteCount);
00325 std::cout << "\tReading " << siteCount << " sites..." << std::endl;
00326
00327 for(SiteIndex i; i < siteCount; i++) {
00328
00329 inStream.read(nameLength);
00330
00331 if(nameLength > sizeof(scratch)) throw -1;
00332 inStream.read(scratch, nameLength);
00333 scratch[nameLength] = 0;
00334
00335 inStream.read(siteTypeIndex);
00336 inStream.read(tileIndex);
00337 inStream.read(flags);
00338 inStream.read(pinMap);
00339
00340 Site& site = const_cast<Site&>(mSites[i]);
00341 site = Site(scratch, mSiteTypes[siteTypeIndex], tileIndex, flags,
00342 mPrimitivePinMaps[pinMap]);
00343 mSiteNameToSiteIndex[scratch] = i;
00344 }
00345
00346
00347 return inStream.getBytesRead() - bytesReadOffset;
00348 }
00349
00350 }
00351 }