00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <boost/test/unit_test.hpp>
00020 #include "torc/bitstream/SpartanBitstream.hpp"
00021 #include "torc/bitstream/SpartanPacket.hpp"
00022 #include "torc/bitstream/Spartan3E.hpp"
00023 #include "torc/common/DeviceDesignator.hpp"
00024 #include "torc/bitstream/OutputStreamHelpers.hpp"
00025 #include "torc/common/TestHelpers.hpp"
00026 #include "torc/common/DirectoryTree.hpp"
00027 #include <fstream>
00028 #include <iostream>
00029
00030 namespace torc {
00031 namespace bitstream {
00032
00033 BOOST_AUTO_TEST_SUITE(bitstream)
00034
00035
00036 BOOST_AUTO_TEST_CASE(SpartanBitstreamCrcUnitTest) {
00037 std::fstream fileStream("Spartan3EUnitTest.reference.bit", std::ios::binary | std::ios::in);
00038 Spartan3E bitstream;
00039 bitstream.read(fileStream, false);
00040 std::cout << bitstream << std::endl;
00041 bitstream.preflightPackets();
00042 BOOST_REQUIRE(true);
00043 }
00044
00045 BOOST_AUTO_TEST_CASE(SpartanBitstreamUnitTest) {
00046
00047
00048 boost::filesystem::path regressionPath
00049 = torc::common::DirectoryTree::getExecutablePath() / "regression";
00050 boost::filesystem::path generatedPath = regressionPath / "Spartan3EBitstreamUnitTest.generated.bit";
00051 boost::filesystem::path referencePath = regressionPath / "Spartan3EUnitTest.reference.bit";
00052
00053
00054 std::fstream fileStream1(referencePath.string().c_str(), std::ios::binary | std::ios::in);
00055 BOOST_REQUIRE(fileStream1.good());
00056 Spartan3E bitstream1;
00057 bitstream1.read(fileStream1, false);
00058
00059 SpartanPacket frameContents;
00060 Spartan3E::const_iterator p = bitstream1.begin();
00061 Spartan3E::const_iterator e = bitstream1.end();
00062 while(p < e) {
00063 if(p->isType2() && p->isWrite()) { frameContents = *p; break; }
00064 p++;
00065 }
00066
00067
00068 SpartanBitstream bitstream;
00069
00070 bitstream.setDesignName("Spartan3EUnitTest.reference.ncd;UserID=0xFFFFFFFF");
00071 bitstream.setDeviceName("xc3s500ecp132");
00072 bitstream.setDesignDate("2010/10/08");
00073 bitstream.setDesignTime("15:06:11");
00074
00075
00076 SpartanPacket dummy(Spartan3E::eSynchronizationDummy);
00077 SpartanPacket nop(SpartanPacket::makeHeader(Spartan3E::ePacketType1, Spartan3E::eOpcodeNOP,
00078 0, 0));
00079
00080 bitstream.insert(bitstream.end(), 1, dummy);
00081
00082 bitstream.push_back(SpartanPacket(Spartan3E::eSynchronizationSync));
00083
00084
00085 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterCMD, Spartan3E::eCommandRCRC));
00086
00087 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterFLR, 0x00000060));
00088
00089 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterCOR,
00090 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "CRC", "Enable") |
00091 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "DonePipe", "No") |
00092 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "DriveDone", "No") |
00093 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "Capture", "Continuous") |
00094 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "ConfigRate", "[UNKNOWN 0]") |
00095 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "StartupClk", "Cclk") |
00096 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "DONE_cycle", "4") |
00097 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "Match_cycle", "1") |
00098 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "LCK_cycle", "NoWait") |
00099 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "GTS_cycle", "5") |
00100 Spartan3E::makeSubfield(Spartan3E::eRegisterCOR, "GWE_cycle", "6") |
00101 0));
00102
00103 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterIDCODE, 0x01c22093));
00104
00105 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterMASK,
00106 Spartan3E::makeSubfield(Spartan3E::eRegisterMASK, "Security", "Protected") |
00107 Spartan3E::makeSubfield(Spartan3E::eRegisterMASK, "Persist", "Protected") |
00108 Spartan3E::makeSubfield(Spartan3E::eRegisterMASK, "GTS_USER_B", "Protected") |
00109 0x00000000 |
00110 0));
00111
00112 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterCMD, Spartan3E::eCommandSWITCH));
00113
00114 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterFAR, 0));
00115
00116 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterCMD, Spartan3E::eCommandWCFG));
00117
00118 bitstream.push_back(SpartanPacket::makeNullType1Write(Spartan3E::eRegisterFDRI));
00119
00120
00121
00122 size_t length = 0x0001149a;
00123 uint32_t* buffer = new uint32_t[length];
00124 uint32_t* ptr = buffer + length - 1;
00125 while(ptr >= buffer) *ptr-- = 0;
00126 bitstream.push_back(SpartanPacket::makeType2Write(0x0001149a, buffer));
00127
00128 bitstream.push_back(nop);
00129
00130 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterCMD,
00131 Spartan3E::eCommandGRESTORE));
00132
00133 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterCMD,
00134 Spartan3E::eCommandLFRM));
00135
00136 bitstream.insert(bitstream.end(), 97, nop);
00137
00138 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterCMD,
00139 Spartan3E::eCommandSTART));
00140
00141 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterCTL,
00142 Spartan3E::makeSubfield(Spartan3E::eRegisterCTL, "Security", "None") |
00143 Spartan3E::makeSubfield(Spartan3E::eRegisterCTL, "Persist", "No") |
00144 Spartan3E::makeSubfield(Spartan3E::eRegisterCTL, "GTS_USER_B", "IoDisabled") |
00145 0x00000000 |
00146 0));
00147
00148 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterCRC, 0x00005f57));
00149
00150 bitstream.push_back(SpartanPacket::makeType1Write(Spartan3E::eRegisterCMD,
00151 Spartan3E::eCommandDESYNCH));
00152 bitstream.insert(bitstream.end(), 4, nop);
00153
00154
00155 std::fstream outputStream(generatedPath.string().c_str(), std::ios::binary | std::ios::out);
00156 BOOST_REQUIRE(outputStream.good());
00157 bitstream.write(outputStream);
00158 outputStream.flush();
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 BOOST_CHECK(torc::common::fileContentsAreEqual(generatedPath, referencePath));
00170
00171 }
00172
00173 BOOST_AUTO_TEST_SUITE_END()
00174
00175 }
00176 }
00177