00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "torc/packer/PrimitiveStructure.hpp"
00020 #include <iostream>
00021
00022 namespace torc {
00023 namespace packer {
00024
00025 using namespace torc::architecture;
00026
00027 boost::regex PrimitiveStructure::sRoutethroughRegEx("^_ROUTETHROUGH.*");
00028 boost::regex PrimitiveStructure::sPrincipalRegEx("^(PAD)$");
00029 boost::regex PrimitiveStructure::sLUTRegEx("^(#LUT:|#RAM:|#ROM:)?<eqn>$");
00030 boost::regex PrimitiveStructure::sFlopRegEx("^(#FF|#LATCH)$");
00031 boost::regex PrimitiveStructure::sPowerRegEx("^.*(VCC|VDD|POWER).*$");
00032 boost::regex PrimitiveStructure::sGroundRegEx("^.*(GND|GROUND).*$");
00033 boost::regex PrimitiveStructure::sInvertingInputRegEx("^.*_B$");
00034
00035
00036 bool PrimitiveStructure::isPreclassified(const PrimitiveElement& inElement) {
00037 return mPreclassified.find(inElement.getName()) != mPreclassified.end();
00038 }
00039
00040 bool PrimitiveStructure::isPrincipal(const PrimitiveElement& inElement) {
00041 return inElement.getName() == mPrimitiveDefPtr->getName()
00042 || regex_match(inElement.getName(), sPrincipalRegEx);
00043 }
00044
00045 bool PrimitiveStructure::isTerminal(const PrimitiveElement& inElement) {
00046 if(inElement.getPins().getSize() != 1) return false;
00047 return !mPrimitiveDefPtr->findPinIndexByName(inElement.getName()).isUndefined();
00048 }
00049
00050 bool PrimitiveStructure::isOrphan(const PrimitiveElement& inElement) {
00051 return inElement.getPins().getSize() == 0;
00052 }
00053
00054 bool PrimitiveStructure::isMux(const PrimitiveElement& inElement, bool& outIsSwitch) {
00055 outIsSwitch = false;
00056
00057 const PrimitiveElement::StringSet& cfgs = inElement.getCfgs();
00058 PrimitiveElement::StringSet::size_type cfgsCount = cfgs.size();
00059 const PrimitiveElementPinArray& elementPins = inElement.getPins();
00060 boost::uint32_t elementPinsCount = elementPins.getSize();
00061
00062
00063 if(cfgsCount == 0) return false;
00064
00065
00066 if(elementPinsCount != cfgsCount + 1) return false;
00067
00068 PrimitiveElement::StringSet inputs;
00069 PrimitiveElementPinArray::const_iterator pp = elementPins.begin();
00070 PrimitiveElementPinArray::const_iterator pe = elementPins.end();
00071 while(pp < pe) { if(pp->isInput()) inputs.insert(pp->getName()); pp++; }
00072 PrimitiveElement::StringSet::size_type inputCount = inputs.size();
00073
00074
00075 PrimitiveElement::StringSet::const_iterator ip = inputs.begin();
00076 PrimitiveElement::StringSet::const_iterator ie = inputs.end();
00077 PrimitiveElement::StringSet::const_iterator cp = cfgs.begin();
00078 while(ip != ie) if(*ip++ != *cp++) return false;
00079
00080
00081 ip = inputs.begin();
00082 while(ip != ie) {
00083 const std::string& input = *ip++;
00084 if(regex_match(input, sInvertingInputRegEx)) {
00085 torc::architecture::xilinx::PinIndex pinIndex = inElement.findPinIndexByName(input);
00086 mInvertedInputs.insert(&elementPins[pinIndex]);
00087 }
00088 }
00089
00090
00091 if(inputCount == 1) outIsSwitch = true;
00092 return true;
00093 }
00094
00095 bool PrimitiveStructure::isPower(const PrimitiveElement& inElement) {
00096 const PrimitiveElementPinArray& elementPins = inElement.getPins();
00097 return elementPins.getSize() == 1 && elementPins[0].getName() == "1"
00098 && regex_match(inElement.getName(), sPowerRegEx);
00099 }
00100
00101 bool PrimitiveStructure::isGround(const PrimitiveElement& inElement) {
00102 const PrimitiveElementPinArray& elementPins = inElement.getPins();
00103 return elementPins.getSize() == 1 && elementPins[0].getName() == "0"
00104 && regex_match(inElement.getName(), sGroundRegEx);
00105 }
00106
00107 bool PrimitiveStructure::isLUT(const PrimitiveElement& inElement, const string& inConfig) {
00108 return regex_match(inConfig, sLUTRegEx);
00109 }
00110
00111 bool PrimitiveStructure::isFlop(const PrimitiveElement& inElement, const string& inConfig) {
00112 return regex_match(inConfig, sFlopRegEx);
00113 }
00114
00115 bool PrimitiveStructure::isRoutethrough(const PrimitiveElement& inElement) {
00116 return regex_match(inElement.getName(), sRoutethroughRegEx);
00117 }
00118
00119 void PrimitiveStructure::initialize(void) {
00120
00121 const PrimitivePinArray& primitivePins = mPrimitiveDefPtr->getPins();
00122 const std::string& primitiveDefName = mPrimitiveDefPtr->getName();
00123 (void) primitivePins;
00124 (void) primitiveDefName;
00125
00126
00127
00128 const PrimitiveElementArray& elements = mPrimitiveDefPtr->getElements();
00129 PrimitiveElementArray::const_iterator ep = elements.begin();
00130 PrimitiveElementArray::const_iterator ee = elements.end();
00131 while(ep < ee) {
00132
00133
00134 const PrimitiveElement& primitiveElement = *ep++;
00135 const std::string& elementName = primitiveElement.getName();
00136
00137
00138 mElements[elementName] = &primitiveElement;
00139
00140
00141 if(isPreclassified(primitiveElement)) {
00142 continue;
00143 }
00144
00145
00146 if(isPrincipal(primitiveElement)) {
00147 mPrincipals[elementName] = &primitiveElement;
00148 continue;
00149 }
00150
00151
00152 if(isTerminal(primitiveElement)) {
00153 mTerminals[elementName] = &primitiveElement;
00154 continue;
00155 }
00156
00157
00158 if(isOrphan(primitiveElement)) {
00159 mOrphans[elementName] = &primitiveElement;
00160 continue;
00161 }
00162
00163
00164 bool processed = false;
00165
00166
00167 bool isSwitch = false;
00168 if(isMux(primitiveElement, isSwitch)) {
00169
00170 mMuxes[elementName] = &primitiveElement;
00171 if(isSwitch) mSwitches[elementName] = &primitiveElement;
00172 processed = true;
00173 continue;
00174 }
00175
00176
00177 if(isPower(primitiveElement)) {
00178 mPower[elementName] = &primitiveElement;
00179 processed = true;
00180 continue;
00181 }
00182
00183 if(isGround(primitiveElement)) {
00184 mGround[elementName] = &primitiveElement;
00185 processed = true;
00186 continue;
00187 }
00188
00189
00190 const PrimitiveElement::StringSet& cfgs = primitiveElement.getCfgs();
00191 PrimitiveElement::StringSet::const_iterator cp = cfgs.begin();
00192 PrimitiveElement::StringSet::const_iterator ce = cfgs.end();
00193 while(cp != ce) {
00194 const std::string& config = *cp++;
00195
00196 if(regex_match(config, sLUTRegEx)) {
00197 mLUTs[elementName] = &primitiveElement;
00198 processed = true;
00199 break;
00200 }
00201
00202 if(isFlop(primitiveElement, config)) {
00203 mFlops[elementName] = &primitiveElement;
00204 processed = true;
00205 break;
00206 }
00207 }
00208 if(processed) continue;
00209
00210
00211 if(isRoutethrough(primitiveElement)) {
00212 mRoutethroughs[elementName] = &primitiveElement;
00213 processed = true;
00214 continue;
00215 }
00216
00217
00218 mUnprocessed[elementName] = &primitiveElement;
00219
00220 debug(primitiveElement);
00221 }
00222 }
00223
00224 void PrimitiveStructure::debug(const PrimitiveElement& inPrimitiveElement) {
00225 const PrimitiveElementPinArray& elementPins = inPrimitiveElement.getPins();
00226 PrimitiveElementPinArray::const_iterator pp = elementPins.begin();
00227 PrimitiveElementPinArray::const_iterator pe = elementPins.end();
00228
00229 while(pp < pe) {
00230 break;
00231 }
00232
00233
00234 const PrimitiveElement::StringSet& cfgs = inPrimitiveElement.getCfgs();
00235 PrimitiveElement::StringSet::const_iterator cp = cfgs.begin();
00236 PrimitiveElement::StringSet::const_iterator ce = cfgs.end();
00237
00238 while(cp != ce) {
00239 break;
00240 }
00241
00242 }
00243
00244 }
00245 }