00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_BITSTREAM_BITSTREAM_HPP
00020 #define TORC_BITSTREAM_BITSTREAM_HPP
00021
00022 #include "torc/common/Endian.hpp"
00023 #include "torc/bitstream/DeviceInfo.hpp"
00024 #include "torc/common/Devices.hpp"
00025 #include "torc/common/EncapsulatedInteger.hpp"
00026 #include <istream>
00027 #include <ostream>
00028 #include <string>
00029 #include <map>
00030
00031
00032 #include <iostream>
00033
00034 namespace torc {
00035 namespace bitstream {
00036
00037 namespace bitstream { class BitstreamUnitTest; }
00038
00039
00040 class Bitstream {
00041 friend class torc::bitstream::bitstream::BitstreamUnitTest;
00042
00043
00044 public:
00045 typedef std::string string;
00046 typedef boost::uint8_t uint8_t;
00047 typedef boost::uint16_t uint16_t;
00048 typedef boost::uint32_t uint32_t;
00049 typedef torc::common::EDevice EDevice;
00050
00051
00052 void write(std::ostream& inStream, uint8_t inVal) {
00053 uint8_t actual = inVal;
00054 inStream.write((char*) &actual, sizeof(actual));
00055 }
00056
00057 void write(std::ostream& inStream, uint16_t inVal) {
00058 uint16_t actual = htons(inVal);
00059 inStream.write((char*) &actual, sizeof(actual));
00060 }
00061
00062 void write(std::ostream& inStream, uint32_t inVal) {
00063 uint32_t actual = htonl(inVal);
00064 inStream.write((char*) &actual, sizeof(actual));
00065 }
00066
00067 void writeHeaderString(std::ostream& inStream, const string& inString) {
00068
00069 uint16_t length = inString.length() + 1;
00070 write(inStream, uint16_t(length));
00071 inStream.write(inString.c_str(), length);
00072 }
00073
00074 static bool expect(std::istream& inStream, uint8_t inExpected) {
00075
00076 uint8_t actual = 0;
00077 inStream.read((char*) &actual, sizeof(actual));
00078
00079 return inExpected == actual;
00080 }
00081
00082 static bool expect(std::istream& inStream, uint16_t inExpected) {
00083
00084 uint16_t actual = 0;
00085 inStream.read((char*) &actual, sizeof(actual));
00086
00087 return inExpected == ntohs(actual);
00088 }
00089
00090 static bool expect(std::istream& inStream, uint32_t inExpected) {
00091
00092 uint32_t actual = 0;
00093 inStream.read((char*) &actual, sizeof(actual));
00094
00095 return inExpected == ntohl(actual);
00096 }
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 static void readHeaderString(std::istream& inStream, string& outString) {
00110
00111 uint16_t length = 0;
00112 inStream.read((char*) &length, sizeof(length));
00113 length = ntohs(length);
00114 if(length > 0) {
00115
00116 char* buffer = new char[length];
00117
00118 inStream.read(buffer, length);
00119
00120 outString.assign(buffer, length - 1);
00121 delete[] buffer;
00122 } else {
00123 outString.clear();
00124 }
00125 }
00126
00127 static bool readHeader(std::istream& inStream, string& outDesignName,
00128 string& outDeviceName, string& outDesignDate, string& outDesignTime,
00129 uint32_t& outBitstreamLength, uint32_t& outHeaderLength) {
00130
00131 bool success = true;
00132
00133 success &= expect(inStream, uint16_t(0x0009));
00134
00135 success &= expect(inStream, uint32_t(0x0ff00ff0));
00136 success &= expect(inStream, uint32_t(0x0ff00ff0));
00137 success &= expect(inStream, uint8_t(0x00));
00138
00139 success &= expect(inStream, uint16_t(0x0001));
00140
00141 success &= expect(inStream, uint8_t('a'));
00142
00143 readHeaderString(inStream, outDesignName);
00144
00145 success &= expect(inStream, uint8_t('b'));
00146
00147 readHeaderString(inStream, outDeviceName);
00148
00149 success &= expect(inStream, uint8_t('c'));
00150
00151 readHeaderString(inStream, outDesignDate);
00152
00153 success &= expect(inStream, uint8_t('d'));
00154
00155 readHeaderString(inStream, outDesignTime);
00156
00157 success &= expect(inStream, uint8_t('e'));
00158
00159 inStream.read((char*) &outBitstreamLength, sizeof(outBitstreamLength));
00160 outBitstreamLength = ntohl(outBitstreamLength);
00161
00162 outHeaderLength = 34 + outDesignName.length() + outDeviceName.length()
00163 + outDesignDate.length() + outDesignTime.length();
00164
00165 return success;
00166 }
00167
00168 void cleanDateAndTime(void) {
00169
00170 size_t pos = 0;
00171 while((pos = mDesignDate.find(' ', pos)) != string::npos) mDesignDate[pos] = '0';
00172 pos = 0;
00173 while((pos = mDesignTime.find(' ', pos)) != string::npos) mDesignTime[pos] = '0';
00174 }
00175
00176 struct Subfield {
00177
00178 uint32_t mMask;
00179
00180 uint32_t mShift;
00181
00182 const char* mBitgenName;
00183
00184 const char* mConfigGuideName;
00185
00186 uint32_t mDefault;
00187
00188 const char** mValues;
00189 };
00190
00191 static void writeSubfieldSettings(std::ostream& inStream, uint32_t inWord,
00192 const Subfield* inSubfields);
00193
00194 static void writeSubfieldSettings(std::ostream& inStream, uint16_t inWord,
00195 const Subfield* inSubfields);
00196
00197
00198
00199 virtual void initializeDeviceInfo(const std::string& inDeviceName) {}
00200
00201
00202 virtual void initializeFrameMaps(void) {}
00203
00204
00205 virtual void writeDeviceInfo(std::ostream& inStream, const std::string& inDeviceName);
00206
00207
00208 void setDeviceInfo(const DeviceInfo& rhs) { mDeviceInfo = rhs; }
00209
00210 void setDevice(const std::string& inDeviceName) {
00211 mDevice = torc::common::Devices::getDeviceEnum(inDeviceName);
00212 }
00213
00214
00215 EDevice mDevice;
00216
00217 string mDesignName;
00218
00219 string mDeviceName;
00220
00221 string mDesignDate;
00222
00223 string mDesignTime;
00224
00225
00226
00227 uint32_t mBitstreamByteLength;
00228
00229
00230
00231 uint32_t mHeaderByteLength;
00232
00233
00234 ColumnDefVector mColumnDefs;
00235
00236 typedef std::map<std::string, uint32_t> TileTypeNameToColumnType;
00237 TileTypeNameToColumnType mTileTypeNameToColumnType;
00238
00239 typedef std::map<uint16_t, uint32_t> TileTypeIndexToColumnType;
00240 TileTypeIndexToColumnType mTileTypeIndexToColumnType;
00241
00242 DeviceInfo mDeviceInfo;
00243 public:
00244
00245
00246 Bitstream(void) : mDevice(torc::common::eDeviceInvalid), mBitstreamByteLength(0) {}
00247
00248 virtual ~Bitstream(void) {}
00249
00250
00251 virtual void read(std::istream& inStream, bool inCleanDateAndTime = true) {
00252 readHeader(inStream);
00253 readPackets(inStream);
00254 if(inCleanDateAndTime) cleanDateAndTime();
00255 }
00256
00257 virtual void readPackets(std::istream& inStream) {}
00258
00259 virtual void readHeader(std::istream& inStream) {
00260 readHeader(inStream, mDesignName, mDeviceName, mDesignDate, mDesignTime,
00261 mBitstreamByteLength, mHeaderByteLength);
00262 setDevice(mDeviceName);
00263 }
00264
00265 virtual void write(std::ostream& inStream) {
00266 preflightPackets();
00267 updatePacketLength();
00268 writeHeader(inStream);
00269 writePackets(inStream);
00270 }
00271
00272 virtual void preflightPackets(void) {}
00273
00274 virtual void updatePacketLength(void) {}
00275
00276 virtual void writePackets(std::ostream& inStream) {}
00277
00278 virtual void writeHeader(std::ostream& inStream) {
00279
00280 write(inStream, uint16_t(0x0009));
00281
00282 write(inStream, uint32_t(0x0ff00ff0));
00283 write(inStream, uint32_t(0x0ff00ff0));
00284 write(inStream, uint8_t(0x00));
00285
00286 write(inStream, uint16_t(0x0001));
00287
00288 write(inStream, uint8_t('a'));
00289 writeHeaderString(inStream, mDesignName);
00290
00291 write(inStream, uint8_t('b'));
00292 writeHeaderString(inStream, mDeviceName);
00293
00294 write(inStream, uint8_t('c'));
00295 writeHeaderString(inStream, mDesignDate);
00296
00297 write(inStream, uint8_t('d'));
00298 writeHeaderString(inStream, mDesignTime);
00299
00300 write(inStream, uint8_t('e'));
00301 write(inStream, uint32_t(mBitstreamByteLength));
00302 }
00303
00304
00305 friend std::ostream& operator<< (std::ostream& os, const Bitstream& rhs);
00306
00307
00308 void setDesignName(const string& inDesignName) { mDesignName = inDesignName; }
00309
00310 void setDeviceName(const string& inDeviceName) { mDeviceName = inDeviceName; }
00311
00312 void setDesignDate(const string& inDesignDate) { mDesignDate = inDesignDate; }
00313
00314 void setDesignTime(const string& inDesignTime) { mDesignTime = inDesignTime; }
00315
00316 const string& getDesignName(void) const { return mDesignName; }
00317
00318 const string& getDeviceName(void) const { return mDeviceName; }
00319
00320 const string& getDesignDate(void) const { return mDesignDate; }
00321
00322 const string& getDesignTime(void) const { return mDesignTime; }
00323
00324
00325 uint32_t getBitstreamByteLength(void) const { return mBitstreamByteLength; }
00326
00327 uint32_t getHeaderByteLength(void) const { return mHeaderByteLength; }
00328
00329 virtual uint32_t getFrameLength(void) const { return 0; }
00330 };
00331
00332 }
00333 }
00334
00335 #endif // TORC_BITSTREAM_BITSTREAM_HPP