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::readSiteTypes(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 SitePin& sitePin = const_cast<SitePin&>(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 sitePin.mFlags = pinFlags;
00143 sitePin.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 ElementPin& elementPin = const_cast<ElementPin&>(element.mPins[k]);
00177
00178 inStream.read(pinFlags);
00179
00180 inStream.read(nameLength);
00181
00182 if(nameLength > sizeof(scratch)) throw -1;
00183 inStream.read(scratch, nameLength);
00184 scratch[nameLength] = 0;
00185
00186 elementPin.mElementPtr = &element;
00187
00188
00189
00190
00191
00192 elementPin.mFlags = pinFlags;
00193 elementPin.mName = scratch;
00194 element.mPinNameToPinIndex[scratch] = xilinx::PinIndex(k);
00195 }
00196
00197
00198 uint32_t cfgCount;
00199 inStream.read(cfgCount);
00200
00201
00202
00203 for(uint32_t k = 0; k < cfgCount; k++) {
00204
00205 inStream.read(nameLength);
00206
00207 if(nameLength > sizeof(scratch)) throw -1;
00208 inStream.read(scratch, nameLength);
00209 scratch[nameLength] = 0;
00210
00211
00212 element.mCfg.insert(scratch);
00213 }
00214
00215 }
00216
00217 uint32_t connCount;
00218 inStream.read(connCount);
00219
00220
00221 primitiveDef.mConnections.setSize(connCount);
00222
00223 const Sites::PrimitiveDef::PrimitiveElementArray& elements = primitiveDef.getElements();
00224 for(uint32_t j = 0; j < connCount; j++) {
00225
00226 PrimitiveConnSharedPtr& connectionPtr = primitiveDef.mConnections[j];
00227 connectionPtr = boost::shared_ptr<PrimitiveConn>(new Sites::PrimitiveConn());
00228 PrimitiveConn& connection = const_cast<PrimitiveConn&>(*connectionPtr);
00229
00230 uint16_t sourceCount;
00231 inStream.read(sourceCount);
00232
00233 if(sourceCount != 1) throw -1;
00234
00235 inStream.read(elementIndex);
00236 inStream.read(pinIndex);
00237 const PrimitiveElement* elementPtr = elements.begin() + elementIndex;
00238 PrimitiveElement& element = const_cast<PrimitiveElement&>(*elementPtr);
00239 const Sites::PrimitiveElement::ElementPinArray& pins = element.getPins();
00240 Sites::ElementPin& pin = const_cast<Sites::ElementPin&>(pins[pinIndex]);
00241 connection.mSourcePtr = &pin;
00242 const_cast<PrimitiveConnSharedPtr&>(pin.mPrimitiveConn) = connectionPtr;
00243
00244 uint16_t sinkCount;
00245 inStream.read(sinkCount);
00246
00247 for(uint32_t k = 0; k < sinkCount; k++) {
00248
00249 inStream.read(elementIndex);
00250 inStream.read(pinIndex);
00251 elementPtr = elements.begin() + elementIndex;
00252 PrimitiveElement& element = const_cast<PrimitiveElement&>(*elementPtr);
00253 const Sites::PrimitiveElement::ElementPinArray& pins = element.getPins();
00254 Sites::ElementPin& pin = const_cast<Sites::ElementPin&>(pins[pinIndex]);
00255 connection.mSinks.push_back(&pin);
00256 const_cast<PrimitiveConnSharedPtr&>(pin.mPrimitiveConn) = connectionPtr;
00257 }
00258 }
00259
00260 }
00261
00262
00263 return inStream.getBytesRead() - bytesReadOffset;
00264 }
00265
00266 size_t Sites::readSitePinMaps(DigestStream& inStream) {
00267
00268 size_t bytesReadOffset = inStream.getBytesRead();
00269 uint16_t sitePinMapCount = 0;
00270 PinCount pinCount;
00271 WireIndex wireIndex;
00272
00273
00274 string sectionName;
00275 inStream.readSectionHeader(sectionName);
00276
00277 if(sectionName != ">>>>Pin Maps>>>>") throw -1;
00278
00279
00280 inStream.read(sitePinMapCount);
00281 mSitePinMaps.setSize(sitePinMapCount);
00282 std::cout << "\tReading " << sitePinMapCount << " site pin maps..." << std::endl;
00283
00284 for(uint16_t i = 0; i < sitePinMapCount; i++) {
00285
00286 inStream.read(pinCount);
00287 mSitePinMaps[i].setSize(pinCount);
00288
00289 Array<const WireIndex>& pins = mSitePinMaps[i];
00290
00291 for(PinCount j; j < pinCount; j++) {
00292
00293 WireIndex& pin = const_cast<WireIndex&>(pins[j]);
00294
00295 inStream.read(wireIndex);
00296 pin = wireIndex;
00297 }
00298 }
00299
00300
00301 return inStream.getBytesRead() - bytesReadOffset;
00302 }
00303
00304 size_t Sites::readSites(DigestStream& inStream) {
00305
00306 size_t bytesReadOffset = inStream.getBytesRead();
00307 char scratch[1 << 10];
00308 uint16_t nameLength = 0;
00309 SiteCount siteCount;
00310 SiteTypeIndex siteTypeIndex;
00311 TileIndex tileIndex;
00312 SiteFlags flags;
00313 uint16_t pinMap = 0;
00314
00315
00316 string sectionName;
00317 inStream.readSectionHeader(sectionName);
00318
00319 if(sectionName != ">>>> Sites >>>>") throw -1;
00320
00321
00322 inStream.read(siteCount);
00323 mSites.setSize(siteCount);
00324 std::cout << "\tReading " << siteCount << " sites..." << std::endl;
00325
00326 for(SiteIndex i; i < siteCount; i++) {
00327
00328 inStream.read(nameLength);
00329
00330 if(nameLength > sizeof(scratch)) throw -1;
00331 inStream.read(scratch, nameLength);
00332 scratch[nameLength] = 0;
00333
00334 inStream.read(siteTypeIndex);
00335 inStream.read(tileIndex);
00336 inStream.read(flags);
00337 inStream.read(pinMap);
00338
00339 Site& site = const_cast<Site&>(mSites[i]);
00340 site = Site(scratch, mSiteTypes[siteTypeIndex], tileIndex, flags, mSitePinMaps[pinMap]);
00341 mSiteNameToSiteIndex[scratch] = i;
00342 }
00343
00344
00345 return inStream.getBytesRead() - bytesReadOffset;
00346 }
00347
00348 }
00349 }