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/packer/PrimitiveStructure.hpp"
00021 #include "torc/architecture/DDB.hpp"
00022 #include "torc/architecture/XdlImporter.hpp"
00023 #include "torc/common/DirectoryTree.hpp"
00024 #include "torc/physical/Instance.hpp"
00025 #include "torc/physical/Net.hpp"
00026 #include <iostream>
00027 #include <fstream>
00028
00029 namespace torc {
00030 namespace packer {
00031
00032 BOOST_AUTO_TEST_SUITE(packer)
00033
00034
00035 BOOST_AUTO_TEST_CASE(PrimitiveStructureUnitTest) {
00036
00037 using namespace torc::architecture;
00038
00039
00040
00041 DDB ddb("xc5vlx30");
00042
00043
00044
00045
00046
00047
00048 const Sites& sites = ddb.getSites();
00049
00050 typedef std::map<std::string, PrimitiveStructureSharedPtr> PrimitiveStructuresSharedPtrMap;
00051 PrimitiveStructuresSharedPtrMap primitiveStructures;
00052
00053 typedef const Array<const PrimitiveDef> PrimitiveDefArray;
00054 PrimitiveDefArray& primitiveDefs = sites.getSiteTypes();
00055 PrimitiveDefArray::const_iterator p = primitiveDefs.begin();
00056 PrimitiveDefArray::const_iterator e = primitiveDefs.end();
00057 while(p < e) {
00058
00059 PrimitiveStructureSharedPtr primitiveStructurePtr(new PrimitiveStructure(&*p++));
00060 const torc::architecture::PrimitiveDef* primitiveDefPtr
00061 = primitiveStructurePtr->getPrimitiveDefPtr();
00062 const std::string& primitiveDefName = primitiveDefPtr->getName();
00063
00064 primitiveStructures[primitiveDefName] = primitiveStructurePtr;
00065 }
00066
00067
00068
00069 PrimitiveStructuresSharedPtrMap::iterator psp = primitiveStructures.begin();
00070 PrimitiveStructuresSharedPtrMap::iterator pse = primitiveStructures.end();
00071 while(psp != pse) {
00072
00073 std::string primitiveDefName = psp->first;
00074 PrimitiveStructureSharedPtr primitiveStructurePtr = psp->second;
00075 (void) primitiveStructurePtr;
00076
00077
00078
00079 psp++;
00080 }
00081
00082 }
00083
00084
00085
00086
00087 BOOST_AUTO_TEST_CASE(PrimitiveStructureInstancePinsUnitTest) {
00088
00089 using namespace torc::architecture;
00090
00091 boost::filesystem::path regressionPath
00092 = torc::common::DirectoryTree::getExecutablePath() / "regression";
00093 boost::filesystem::path generatedPath = regressionPath / "DesignUnitTest.generated.xdl";
00094 boost::filesystem::path referencePath = regressionPath / "DesignUnitTest.reference.xdl";
00095
00096
00097 std::fstream fileStream(referencePath.string().c_str());
00098 BOOST_REQUIRE(fileStream.good());
00099 XdlImporter importer;
00100 importer(fileStream, referencePath.string());
00101
00102
00103 torc::physical::DesignSharedPtr designPtr = importer.getDesignPtr();
00104 BOOST_REQUIRE(designPtr.get() != 0);
00105
00106
00107 DDB* ddbPtr = importer.releaseDDBPtr();
00108
00109
00110 const Sites& sites = ddbPtr->getSites();
00111
00112 typedef std::map<std::string, PrimitiveStructureSharedPtr> PrimitiveStructuresSharedPtrMap;
00113 PrimitiveStructuresSharedPtrMap primitiveStructures;
00114
00115 typedef const Array<const PrimitiveDef> PrimitiveDefArray;
00116 PrimitiveDefArray& primitiveDefs = sites.getSiteTypes();
00117 PrimitiveDefArray::const_iterator p = primitiveDefs.begin();
00118 PrimitiveDefArray::const_iterator e = primitiveDefs.end();
00119 while(p < e) {
00120
00121 PrimitiveStructureSharedPtr primitiveStructurePtr(new PrimitiveStructure(&*p++));
00122 const torc::architecture::PrimitiveDef* primitiveDefPtr
00123 = primitiveStructurePtr->getPrimitiveDefPtr();
00124 const std::string& primitiveDefName = primitiveDefPtr->getName();
00125
00126 primitiveStructures[primitiveDefName] = primitiveStructurePtr;
00127 }
00128
00129
00130 torc::physical::Circuit::InstanceSharedPtrIterator instancePtrIterator
00131 = designPtr->findInstance("blink");
00132 if(instancePtrIterator == designPtr->instancesEnd()) return;
00133 torc::physical::InstanceSharedPtr instancePtr = *instancePtrIterator;
00134 PrimitiveStructureSharedPtr primitiveStructurePtr = primitiveStructures[instancePtr->getType()];
00135 const PrimitiveDef* primitiveDefPtr = primitiveStructurePtr->getPrimitiveDefPtr();
00136 if(primitiveDefPtr == 0) return;
00137 const PrimitivePinArray& primitivePins = primitiveDefPtr->getPins();
00138
00139 using torc::physical::InstancePinSharedPtr;
00140 using torc::physical::InstancePinSharedPtrVector;
00141 using torc::physical::Instance;
00142 using torc::physical::NetSharedPtr;
00143 using torc::architecture::xilinx::PinIndex;
00144
00145
00146 InstancePinSharedPtrVector inputPins;
00147 InstancePinSharedPtrVector outputPins;
00148 Instance::InstancePinSharedPtrConstIterator ipp = instancePtr->pinsBegin();
00149 Instance::InstancePinSharedPtrConstIterator ipe = instancePtr->pinsEnd();
00150 while(ipp != ipe) {
00151
00152 InstancePinSharedPtr instancePinPtr = ipp++->second;
00153 const std::string& pinName = instancePinPtr->getPinName();
00154 NetSharedPtr netPtr = instancePinPtr->getParentWeakPtr().lock();
00155 std::cout << " found " << pinName << " connected to net " << netPtr->getName() << ": ";
00156
00157 PinIndex pinIndex = primitiveDefPtr->findPinIndexByName(pinName);
00158 if(static_cast<boost::int32_t>(pinIndex) < 0) continue;
00159 const PrimitivePin& primitivePin = primitivePins[pinIndex];
00160 if(primitivePin.isInput()) inputPins.push_back(instancePinPtr);
00161 if(primitivePin.isOutput()) outputPins.push_back(instancePinPtr);
00162 std::cout << (primitivePin.isInput() ? "INPUT" : (primitivePin.isOutput() ? "OUTPUT" : ""))
00163 << std::endl;
00164 }
00165
00166
00167 InstancePinSharedPtrVector::const_iterator ip;
00168 InstancePinSharedPtrVector::const_iterator ie;
00169 ip = inputPins.begin();
00170 ie = inputPins.end();
00171 while(ip != ie) {
00172 InstancePinSharedPtr instancePinPtr = *ip++;
00173
00174 }
00175
00176 ip = outputPins.begin();
00177 ie = outputPins.end();
00178 while(ip != ie) {
00179 InstancePinSharedPtr instancePinPtr = *ip++;
00180
00181 }
00182
00183 }
00184
00185
00186 BOOST_AUTO_TEST_SUITE_END()
00187
00188 }
00189 }