00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_BITSTREAM_SPARTAN6_HPP
00020 #define TORC_BITSTREAM_SPARTAN6_HPP
00021
00022 #include <boost/cstdint.hpp>
00023 #include "torc/bitstream/Spartan6Bitstream.hpp"
00024
00025 namespace torc {
00026 namespace bitstream {
00027
00028 namespace bitstream { class Spartan6UnitTest; }
00029
00030
00031 class Spartan6 : public Spartan6Bitstream {
00032 friend class torc::bitstream::bitstream::Spartan6UnitTest;
00033 protected:
00034
00035
00036 typedef boost::uint16_t uint16_t;
00037 typedef boost::uint32_t uint32_t;
00038 public:
00039
00040
00041
00042
00043 enum ERegister { eRegisterCRC = 0, eRegisterFARMAJ, eRegisterFARMIN, eRegisterFDRI, eRegisterFDRO,
00044 eRegisterCMD, eRegisterCTL, eRegisterMASK, eRegisterSTAT, eRegisterLOUT, eRegisterCOR1,
00045 eRegisterCOR2, eRegisterPWRDN_REG, eRegisterFLR, eRegisterIDCODE, eRegisterCWDT, eRegisterHC_OPT_REG,
00046 eRegisterCSBO, eRegisterGENERAL1, eRegisterGENERAL2, eRegisterGENERAL3, eRegisterGENERAL4,
00047 eRegisterGENERAL5, eRegisterMODE_REG, eRegisterPU_GWE, eRegisterPU_GTS, eRegisterMFWR, eRegisterCCLK_FREQ,
00048 eRegisterSEU_OPT, eRegisterEXP_SIGN, eRegisterRDBK_SIGN, eRegisterBOOSTS, eRegisterEYE_MASK,
00049 eRegisterCBC_REG, eRegisterCount };
00050
00051
00052
00053 enum ECommand { eCommandNULL = 0, eCommandWCFG, eCommandMFW, eCommandLFRM, eCommandRCFG,
00054 eCommandSTART, eCommandRCRC = 7, eCommandAGHIGH, eCommandGRESTORE = 10, eCommandSHUTDOWN, eCommandDESYNC = 13,
00055 eCommandIPROG, eCommandCount };
00056
00057
00058
00059 enum EFarMaj {
00060 eFarMajMaskBlock = 0xf000, eFarMajShiftBlock = 12,
00061 eFarMajMaskRow = 0x0f00, eFarMajShiftRow = 8,
00062 eFarMajMaskMajor = 0x00ff, eFarMajShiftMajor = 0
00063 };
00064
00065
00066
00067 enum EFarMin {
00068 eFarMinMaskBlock = 0xc000, eFarMinShiftBlock = 12,
00069 eFarMinMaskMinor = 0x01ff, eFarMinShiftMinor = 0
00070 };
00071
00072
00073
00074
00075 enum EFarBlockType { eFarBlockType0 = 0, eFarBlockType1, eFarBlockType2, eFarBlockType3,
00076 eFarBlockType4, eFarBlockType5, eFarBlockType6, eFarBlockType7, eFarBlockTypeCount };
00077
00078
00079
00080
00081 enum { eFrameLength = 41 };
00082 protected:
00083
00084
00085
00086
00087 static const char* sPacketTypeName[ePacketTypeCount];
00088
00089 static const char* sOpcodeName[eOpcodeCount];
00090
00091 static const char* sRegisterName[eRegisterCount];
00092
00093 static const char* sCommandName[eCommandCount];
00094
00095 static const Subfield sCOR1[];
00096
00097 static const Subfield sCOR2[];
00098
00099 static const Subfield sSTAT[];
00100
00101 static const Subfield sCTL[];
00102
00103 static const Subfield sMASK[];
00104
00105 static const Subfield sPWRDN_REG[];
00106
00107 static const Subfield sHC_OPT_REG[];
00108
00109 static const Subfield sMODE_REG[];
00110
00111 static const Subfield sBOOSTS[];
00112
00113 static const Subfield sSEU_OPT[];
00114 public:
00115 static uint16_t makeSubfield(ERegister inRegister, const std::string& inSubfield,
00116 const std::string& inSetting);
00117
00118
00119 friend std::ostream& operator<< (std::ostream& os, const Spartan6& rhs);
00120
00121 class FrameMajorAddress {
00122 protected:
00123 void assign(uint16_t inMajAddress) {
00124 mMajBlock = (inMajAddress & eFarMajMaskBlock) >> eFarMajShiftBlock;
00125 mMajRow = (inMajAddress & eFarMajMaskRow) >> eFarMajShiftRow;
00126 mMajMajor = (inMajAddress & eFarMajMaskMajor) >> eFarMajShiftMajor;
00127 }
00128 public:
00129 FrameMajorAddress(void) : mMajBlock(0), mMajRow(0), mMajMajor(0) {}
00130 FrameMajorAddress(uint16_t inMajBlock, uint16_t inMajRow, uint16_t inMajMajor)
00131 : mMajBlock(inMajBlock), mMajRow(inMajRow), mMajMajor(inMajMajor) {}
00132 FrameMajorAddress(uint16_t inMajAddress) { assign(inMajAddress); }
00133 uint16_t mMajBlock;
00134 uint16_t mMajRow;
00135 uint16_t mMajMajor;
00136
00137 bool operator== (const FrameMajorAddress& rhs) const {
00138 return mMajBlock == rhs.mMajBlock && mMajRow == rhs.mMajRow && mMajMajor == rhs.mMajMajor;
00139 }
00140 bool operator< (const FrameMajorAddress& rhs) const {
00141 int diffMajBlock = mMajBlock - rhs.mMajBlock;
00142 if(diffMajBlock) return diffMajBlock < 0;
00143 int diffMajRow = mMajRow - rhs.mMajRow;
00144 if(diffMajRow) return diffMajRow < 0;
00145 return mMajMajor < rhs.mMajMajor;
00146 }
00147 private:
00148 };
00149
00150 class FrameMinorAddress {
00151 protected:
00152 void assign(uint16_t inMinAddress) {
00153 mMinBlock = (inMinAddress & eFarMinMaskBlock) >> eFarMinShiftBlock;
00154 mMinMinor = (inMinAddress & eFarMinMaskMinor) >> eFarMinShiftMinor;
00155 }
00156 public:
00157 FrameMinorAddress(void) : mMinBlock(0), mMinMinor(0) {}
00158 FrameMinorAddress(uint16_t inMinBlock, uint16_t inMinMinor) : mMinBlock(inMinBlock), mMinMinor(inMinMinor) {}
00159 FrameMinorAddress(uint16_t inMinAddress) { assign(inMinAddress); }
00160 uint16_t mMinBlock;
00161 uint16_t mMinMinor;
00162
00163 bool operator== (const FrameMinorAddress& rhs) const {
00164 return mMinBlock == rhs.mMinBlock && mMinMinor == rhs.mMinMinor;
00165 }
00166 bool operator< (const FrameMinorAddress& rhs) const {
00167 int diffMinBlock = mMinBlock - rhs.mMinBlock;
00168 if(diffMinBlock) return diffMinBlock < 0;
00169 return mMinMinor < rhs.mMinMinor;
00170 }
00171 private:
00172 };
00173
00174 };
00175
00176 }
00177 }
00178
00179 #endif // TORC_BITSTREAM_SPARTAN6_HPP