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 <iostream>
00021 #include <sstream>
00022 #include "torc/generic/decompiler/Decompiler.hpp"
00023 #include "torc/generic/om/ObjectFactory.hpp"
00024 #include "torc/generic/om/ScalarNet.hpp"
00025 #include "torc/generic/parser/Linker.hpp"
00026 #include "torc/generic/parser/ParserOptions.hpp"
00027 #include "torc/generic/parser/EdifParser.hpp"
00028 #include "torc/generic/util/MessageTable.hpp"
00029 #include <boost/regex.hpp>
00030
00031
00032
00033 namespace torc {
00034 namespace generic {
00035
00036 BOOST_AUTO_TEST_SUITE(generic)
00037
00038 class VisitNet {
00039 public:
00040 typedef boost::shared_ptr<Net> NetSharedPtr;
00041 void operator ()(NetSharedPtr& inNetPtr) const {
00042 int sources = 0;
00043 int sinks = 0;
00044
00045
00046 typedef boost::shared_ptr<Port> PortSharedPtr;
00047 std::vector<PortSharedPtr> ports;
00048 inNetPtr->getConnectedPorts(ports);
00049 std::vector<PortSharedPtr>::const_iterator pp = ports.begin();
00050 std::vector<PortSharedPtr>::const_iterator pe = ports.end();
00051 while(pp < pe) {
00052 const PortSharedPtr& portPtr = *pp++;
00053 PortDirection direction = portPtr->getDirection();
00054 switch(direction) {
00055 case ePortDirectionIn: sources++; break;
00056 case ePortDirectionOut: sinks++; break;
00057 case ePortDirectionInOut: sources++; sinks++; break;
00058 default: break;
00059 }
00060 }
00061
00062 typedef boost::shared_ptr<PortReference> PortReferenceSharedPtr;
00063 std::vector<PortReferenceSharedPtr> portReferences;
00064 inNetPtr->getConnectedPortRefs(portReferences);
00065
00066 std::vector<PortReferenceSharedPtr>::const_iterator rp = portReferences.begin();
00067 std::vector<PortReferenceSharedPtr>::const_iterator re = portReferences.end();
00068 while(rp < re) {
00069 const PortReferenceSharedPtr& portRefPtr = *rp++;
00070 const PortSharedPtr& portPtr = portRefPtr->getMaster();
00071 PortDirection direction = portPtr->getDirection();
00072 switch(direction) {
00073 case ePortDirectionIn: sinks++; break;
00074 case ePortDirectionOut: sources++; break;
00075 case ePortDirectionInOut: sources++; sinks++; break;
00076 default: break;
00077 }
00078 }
00079 BOOST_REQUIRE_EQUAL(sources, 1);
00080 std::cerr << "Net " << inNetPtr->getName() << ": "
00081 << ports.size() << " ports, "
00082 << portReferences.size() << " portRefs, "
00083 << sources << " sources, "
00084 << sinks << " sinks"
00085 << std::endl;
00086 }
00087 };
00088
00089
00090 BOOST_AUTO_TEST_CASE(Om1UnitTest) {
00091
00092
00093 std::stringstream generated;
00094 std::stringstream parsed;
00095
00096 std::cout << "Generating " << "and.edf" << " ... ";
00097 try {
00098
00099 boost::shared_ptr<ObjectFactory> objectFactoryPtr(new ObjectFactory());
00100
00101
00102 RootSharedPtr rootPtr = objectFactoryPtr->newRootPtr("and");
00103 rootPtr->setOriginalName("AND");
00104
00105
00106 LibrarySharedPtr virtexLibraryPtr = objectFactoryPtr->newLibraryPtr("VIRTEX", rootPtr);
00107 LibrarySharedPtr workLibraryPtr = objectFactoryPtr->newLibraryPtr("work", rootPtr);
00108
00109
00110 CellSharedPtr lut2CellPtr = objectFactoryPtr->newCellPtr("LUT2", virtexLibraryPtr);
00111 ViewSharedPtr lut2ViewPtr = objectFactoryPtr->newViewPtr("PRIM", lut2CellPtr);
00112 ScalarPortSharedPtr lut2I0PortPtr = objectFactoryPtr->newScalarPortPtr("I0",
00113 ePortDirectionIn, lut2ViewPtr);
00114 ScalarPortSharedPtr lut2I1PortPtr = objectFactoryPtr->newScalarPortPtr("I1",
00115 ePortDirectionIn, lut2ViewPtr);
00116 ScalarPortSharedPtr lut2OPortPtr = objectFactoryPtr->newScalarPortPtr("O",
00117 ePortDirectionOut, lut2ViewPtr);
00118
00119
00120 CellSharedPtr andCellPtr = objectFactoryPtr->newCellPtr("and", workLibraryPtr,
00121 Cell::eTypeGeneric, "AND");
00122 ViewSharedPtr andViewPtr = objectFactoryPtr->newViewPtr("verilog", andCellPtr);
00123 ScalarPortSharedPtr andI0PortPtr = objectFactoryPtr->newScalarPortPtr("I0",
00124 ePortDirectionIn, andViewPtr);
00125 ScalarPortSharedPtr andI1PortPtr = objectFactoryPtr->newScalarPortPtr("I1",
00126 ePortDirectionIn, andViewPtr);
00127 ScalarPortSharedPtr andOPortPtr = objectFactoryPtr->newScalarPortPtr("O",
00128 ePortDirectionOut, andViewPtr);
00129
00130
00131 SingleInstanceSharedPtr oZ0InstancePtr = objectFactoryPtr->newSingleInstancePtr("oZ0",
00132 andViewPtr, lut2ViewPtr, "o");
00133 ScalarPortReferenceSharedPtr oZ0I0PortReferencePtr
00134 = objectFactoryPtr->newScalarPortReferencePtr(oZ0InstancePtr, lut2I0PortPtr);
00135 ScalarPortReferenceSharedPtr oZ0I1PortReferencePtr
00136 = objectFactoryPtr->newScalarPortReferencePtr(oZ0InstancePtr, lut2I1PortPtr);
00137 ScalarPortReferenceSharedPtr oZ0OPortReferencePtr
00138 = objectFactoryPtr->newScalarPortReferencePtr(oZ0InstancePtr, lut2OPortPtr);
00139
00140
00141 ScalarNetSharedPtr i0NetPtr = objectFactoryPtr->newScalarNetPtr("i0", andViewPtr);
00142 andI0PortPtr->connect(i0NetPtr);
00143 oZ0I0PortReferencePtr->connect(i0NetPtr);
00144 ScalarNetSharedPtr i1NetPtr = objectFactoryPtr->newScalarNetPtr("i1", andViewPtr);
00145 andI1PortPtr->connect(i1NetPtr);
00146 oZ0I1PortReferencePtr->connect(i1NetPtr);
00147 ScalarNetSharedPtr oNetPtr = objectFactoryPtr->newScalarNetPtr("o", andViewPtr);
00148 andOPortPtr->connect(oNetPtr);
00149 oZ0OPortReferencePtr->connect(oNetPtr);
00150
00151
00152 PropertySharedPtr initPropertyPtr = objectFactoryPtr->newPropertyPtr("INIT", oZ0InstancePtr,
00153 Value(Value::eValueTypeString, std::string("8")));
00154 (void) initPropertyPtr;
00155
00156
00157 DesignSharedPtr designPtr = objectFactoryPtr->newDesignPtr("and", rootPtr, "and", "work",
00158 "AND");
00159
00160
00161 PropertySharedPtr partPropertyPtr = objectFactoryPtr->newPropertyPtr("PART", designPtr,
00162 Value(Value::eValueTypeString, std::string("xc5vlx30ff324-1")));
00163 partPropertyPtr->setOwner("Xilinx");
00164
00165 std::cout << "done." << std::endl;
00166
00167
00168
00169 Decompiler decompiler(rootPtr);
00170 decompiler();
00171
00172
00173
00174
00175
00176 } catch(Error& e) {
00177 std::cerr << MessageTable::instance()->getMessage(e.getErrorMessageId()) << std::endl;
00178 const std::vector<Error::StackFrameInfo> &stack = e.getStackTrace();
00179 for(std::vector<Error::StackFrameInfo>::const_iterator it = stack.begin();
00180 it != stack.end(); it++) {
00181 std::cerr << " " << (*it).getFunction() << "() [" << (*it).getFile() << ":"
00182 << (*it).getLine() << "]" << std::endl;
00183 }
00184 }
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 BOOST_CHECK_EQUAL(generated.str(), parsed.str());
00212
00213 }
00214
00215 BOOST_AUTO_TEST_SUITE_END()
00216
00217 }
00218 }
00219
00220
00221 #if 0
00222 (edif (rename and "AND")
00223 (edifVersion 2 0 0)
00224 (edifLevel 0)
00225 (keywordMap (keywordLevel 0))
00226 (status
00227 (written
00228 (timeStamp 2010 8 30 21 51 32)
00229 (author "Synplicity, Inc.")
00230 (program "Synplify Pro" (version "C-2009.06-SP1, mapper map450rcp1sp1, Build 037R"))
00231 )
00232 )
00233 (library VIRTEX
00234 (edifLevel 0)
00235 (technology (numberDefinition ))
00236 (cell LUT2 (cellType GENERIC)
00237 (view PRIM (viewType NETLIST)
00238 (interface
00239 (port I0 (direction INPUT))
00240 (port I1 (direction INPUT))
00241 (port O (direction OUTPUT))
00242 )
00243 )
00244 )
00245 )
00246 (library work
00247 (edifLevel 0)
00248 (technology (numberDefinition ))
00249 (cell (rename and "AND") (cellType GENERIC)
00250 (view verilog (viewType NETLIST)
00251 (interface
00252 (port i0 (direction INPUT))
00253 (port i1 (direction INPUT))
00254 (port o (direction OUTPUT))
00255 )
00256 (contents
00257 (instance (rename oZ0 "o") (viewRef PRIM (cellRef LUT2 (libraryRef VIRTEX)))
00258 (property INIT (string "8"))
00259 )
00260 (net i0 (joined
00261 (portRef i0)
00262 (portRef I0 (instanceRef oZ0))
00263 ))
00264 (net i1 (joined
00265 (portRef i1)
00266 (portRef I1 (instanceRef oZ0))
00267 ))
00268 (net o (joined
00269 (portRef O (instanceRef oZ0))
00270 (portRef o)
00271 ))
00272 )
00273 )
00274 )
00275 )
00276 (design (rename and "AND") (cellRef and (libraryRef work))
00277 (property PART (string "xc5vlx30ff324-1") (owner "Xilinx")))
00278 )
00279 #endif