Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

oagFpgaModGraph.h

Go to the documentation of this file.
00001 
00002 #if !defined(oagFpgaModGraph_P)
00003 #define oagFpgaModGraph_P
00004 
00005 #include <stdlib.h>
00006 
00007 #include "oaDesignDB.h"
00008 #include "oagFpgaModRef.h"
00009 #include "oagFpgaManager.h"
00010 #include "oagFpgaRtlGraph.h"
00011 #include <list>
00012 #include <set>
00013 
00014 using namespace std;
00015 
00016 namespace oagFpga {
00017 
00018 // *****************************************************************************
00019 // ModGraph
00020 //
00045 //
00046 // *****************************************************************************
00047 
00048 class ModGraph {
00049 //  friend class SimMod;
00050 
00051   private:
00052         
00053                                    ModGraph();   // this is a purely static
00054                                                  // class and can not be
00055                                                  // instantiated
00056   public:
00057 
00058 /*
00059     typedef set<ModRef> Cut;
00060     typedef list<Cut>   CutSet;
00061 */
00062     
00065 
00066     static ModRef           getNull(oa::oaModule *module) {
00076         return ModRef(RtlGraph::getNull(), module);
00077     }
00078     static inline bool      isNull(ModRef x) {
00084         return RtlGraph::isNull(x.ref);
00085     }
00086     static inline ModRef    constantOne(oa::oaModule *module) {
00090         return ModRef(getGraph(module)->constantOne(), module);
00091     }
00092     static inline ModRef    constantZero(oa::oaModule *module) {
00096         return ModRef(getGraph(module)->constantZero(), module);
00097     }
00098     /*
00099     static inline ModRef notOf(ModRef x) {
00106         return ModRef(RtlGraph::notOf(x.ref), x.module);
00107     }
00108     static inline bool       isInverted(ModRef x) {
00112         return oagAi::Graph::isInverted(x.ref);
00113     }
00114     static inline ModRef     getNonInverted(ModRef x) {
00118         return ModRef(oagAi::Graph::getNonInverted(x.ref), x.module);
00119     }
00120     
00124     
00125     static inline unsigned int getUserData(ModRef x, unsigned int index) {
00131         return getGraph(x)->getUserData(x.ref, index);
00132     }
00133     static inline void         setUserData(ModRef x, unsigned int index, unsigned int data) {
00139         getGraph(x)->setUserData(x.ref, index, data);
00140     }
00141     */
00142     
00143     /*
00147     
00148     static ModRef           newSequential(ModRef nextState) {
00156         return ModRef(getGraph(nextState)->newSequential(nextState.ref), nextState.module);
00157     }
00158     static ModRef           newTerminal(ModRef terminal) {
00162         return ModRef(getGraph(terminal)->newTerminal(terminal.ref), terminal.module);    
00163     }
00164     static ModRef           newAnd(ModRef x, ModRef y);
00165     static ModRef           andOf(ModRef x, ModRef y);
00166     */
00167     static void             setTerminalDriver(ModRef terminal, ModRef driver);    
00168     /*
00169     static void             setNextState(ModRef sequential, ModRef nextState);
00170     static void             setAndLeft(ModRef x, ModRef left);
00171     static void             setAndRight(ModRef x, ModRef left);
00172     
00173     static void             resubstitute(ModRef original, ModRef replacement);
00174     static void             resubstitute(ModRef original, ModRef replacement, ModRef target);
00175     static void             detach(ModRef x);
00176     */
00177     
00181     
00182     static inline RtlNode::FuncType   getNodeType(ModRef x) {
00186         return getGraph(x)->getNodeType(x.ref);
00187     }    
00188 
00189     static inline RtlNode::OptType   getNodeOptType(ModRef x) {
00193         return getGraph(x)->getNodeOptType(x.ref);
00194     }    
00195 
00196     static inline RtlNode::SeqType   getNodeSeqType(ModRef x) {
00200         return getGraph(x)->getNodeSeqType(x.ref);
00201     }    
00202     static inline int               getNumOutputBits(ModRef x) {
00205         return getGraph(x)->getNumOutputBits(x.ref);
00206     }
00207     static inline BBRef             getPrimaryBBID(ModRef x) {
00210         return getGraph(x)->getPrimaryBBID(x.ref);
00211     }
00212 
00213     
00214     //    on terminal nodes...
00215     static ModRef         getTerminalDriver(ModRef terminal) {
00227         return ModRef(getGraph(terminal)->getTerminalDriver(terminal.ref), terminal.module);    
00228     }
00229     static bool           isTerminal(ModRef x) {
00233         return getGraph(x)->isTerminal(x.ref);    
00234     }
00235     static bool           isFunctional(ModRef x) {
00237         //         OPERATOR).
00240         return getGraph(x)->isFunctional(x.ref);    
00241     }
00242     //    on sequential nodes...
00243     static ModRef         getNextState(ModRef sequential) {
00250         return ModRef(getGraph(sequential)->getNextState(sequential.ref), sequential.module);    
00251     }
00252     static bool           isSequential(ModRef x) {
00256         return getGraph(x)->isSequential(x.ref);    
00257     }
00258     /*
00259     static oagAi::Node::SequentialData *getSequentialData(ModRef sequential) {
00266         return getGraph(sequential)->getSequentialData(sequential.ref);    
00267     }
00268     //    on and nodes...
00269     static bool           isAnd(ModRef x) {
00273         return getGraph(x)->isAnd(x.ref);    
00274     }
00275     static inline ModRef         getAndLeft(ModRef x) {
00282         return ModRef(getGraph(x)->getAndLeft(x.ref), x.module);
00283     }
00284     static inline ModRef         getAndRight(ModRef x) {
00291         return ModRef(getGraph(x)->getAndRight(x.ref), x.module);
00292     }
00293     */
00294     // on all nodes...
00295     static list<ModRef>      getFanin(ModRef x);
00296     static list<ModRef>      getFanout(ModRef x);
00297     static void              getFanout(ModRef x, list<ModRef> &result);
00298     static inline bool       hasFanout(ModRef x) {
00303         return getGraph(x)->hasFanout(x.ref);
00304     }
00305 
00309     
00310     static ModRef              prepareNetToBBConnection(oa::oaModBitNet *net);
00311     static oa::oaModBitNet *   getNetToBBConnection(ModRef ref);
00312     static ModRef              getNetToBBConnection(oa::oaModBitNet *net);
00313     static void                setNetToBBConnection(oa::oaModBitNet *net, ModRef ref);
00314     static void                removeNetToBBConnection(oa::oaModBitNet *net);
00315 
00316     static oa::oaModBitNet *   findDriverOfEquivalentNets(oa::oaModBitNet *net);
00317 
00318     static void                connectEquivalentNetsInGraph(oa::oaModule *module);
00319 
00323     
00324     static bool   hasCombinationalCycle(oa::oaModule *module);
00325 
00326     /*
00327                               
00328     static CutSet enumerateKfeasibleCuts(ModRef x, unsigned int maxCutSize,
00329                                          int maxCutCout = -1, int maxCutDepth = -1,
00330                                          bool includeConstantNode = true);
00331     static void   clearKfeasibleCuts(oa::oaModule *module);
00332     */
00333 
00334     static void   getTransitiveFanin(ModRef x, list<ModRef> &transitiveFanin, 
00335                                      bool includeRoots = true, bool crossSequential = false);
00336     static void   getTransitiveFanin(ModRef x, vector<ModRef> &transitiveFanin, 
00337                                      bool includeRoots = true, bool crossSequential = false);
00338     static void   getTransitiveFanin(list<ModRef> x, list<ModRef> &transitiveFanin, 
00339                                      bool includeRoots = true, bool crossSequential = false);
00340     static void   getTransitiveFanin(list<ModRef> x, vector<ModRef> &transitiveFanin, 
00341                                      bool includeRoots = true, bool crossSequential = false);
00342 
00343     static void   getTransitiveFanout(ModRef x, list<ModRef> &transitiveFanout, 
00344                                       bool includeRoots = true, bool crossSequential = false);
00345     static void   getTransitiveFanout(ModRef x, vector<ModRef> &transitiveFanout, 
00346                                       bool includeRoots = true, bool crossSequential = false);
00347     static void   getTransitiveFanout(list<ModRef> x, list<ModRef> &transitiveFanout, 
00348                                       bool includeRoots = true, bool crossSequential = false);
00349     static void   getTransitiveFanout(list<ModRef> x, vector<ModRef> &transitiveFanout, 
00350                                       bool includeRoots = true, bool crossSequential = false);
00351 
00352     /*
00353     static void   getFaninCone(ModRef x, const list<ModRef> &coneRoots, 
00354                                list<ModRef> &transitiveFanin, bool includeRoots = true);
00355     static void   getFanoutCone(ModRef x, const list<ModRef> &coneRoots, 
00356                                 list<ModRef> &transitiveFanout, bool includeRoots = true);
00357     
00358     static void   getFaninRoots(ModRef x, list<ModRef> &faninRoots);
00359     static void   getFanoutRoots(ModRef x, list<ModRef> &fanoutRoots);
00360 
00364     
00365     static bool         testEquivalence(ModRef x, ModRef y);
00366     static void         setEquivalent(ModRef x, ModRef y);
00367     static void         getEquivalents(ModRef x, list<ModRef> & result);
00368     static void         removeEquivalences(ModRef x) {
00375         getGraph(x)->removeEquivalences(x.ref);
00376     }
00377     static void         chooseEquivalent(ModRef x) {
00385         getGraph(x)->chooseEquivalent(x.ref);
00386     }
00387 
00388     static void         getFanoutOfEquivalentNodes(ModRef x, list<ModRef> & result);
00389     */
00390 
00394 
00395     /*
00396     static void         print(oa::oaModule *module);
00397     
00398     static void         getAllNodes(oa::oaModule *module, list<ModRef> &result);
00399     static void         getInputs(oa::oaModule *module, list<ModRef> &result);
00400     */
00401     static void         getOutputs(oa::oaModule *module, list<ModRef> &result);
00402     /*
00403     static void         getLocalStates(oa::oaModule *module, list<ModRef> &result);    
00404 
00405     static void                getAllConnections(oa::oaModBitNet *net,
00406                                     set<oa::oaModBitNet*> &connectedNets,
00407                                     set<ModRef> &connectedRefs,
00408                                     bool searchForwardThroughGraph = true,
00409                                     bool searchBackwardThroughGraph = true,
00410                                     bool searchThroughEquivNets = true,
00411                                     bool searchThroughEquivRefs = false,
00412                                     bool includeSelf = true);
00413     static void                getAllConnections(ModRef x, 
00414                                     set<oa::oaModBitNet*> &connectedNets,
00415                                     set<ModRef> &connectedRefs,
00416                                     bool searchForwardThroughGraph = true,
00417                                     bool searchBackwardThroughGraph = true,
00418                                     bool searchThroughEquivNets = true,
00419                                     bool searchThroughEquivRefs = false,
00420                                     bool includeSelf = true);
00421 
00425     
00426     static void         incrementExternalReferences(ModRef x) {
00436         getGraph(x)->incrementExternalReferences(x.ref);
00437     }
00438     static void         decrementExternalReferences(ModRef x) {
00446         getGraph(x)->decrementExternalReferences(x.ref);
00447     }
00448     static void         clearExternalReferences(ModRef x) {
00452         getGraph(x)->clearExternalReferences(x.ref);
00453     }
00454     */
00455 
00457 
00458     public:
00459   
00460     static inline RtlGraph *   getGraph(oa::oaDesign *design) {
00467         return &(Manager::get(design)->bbg);
00468     }
00469     static inline RtlGraph *   getGraph(oa::oaModule *module) {
00477         return &(Manager::get(module->getDesign())->bbg);
00478     }
00479     static inline RtlGraph *   getGraph(const ModRef &x) {
00482         return &(Manager::get(x.module->getDesign())->bbg);
00483     }
00484 
00485     static void             failIfInDifferentModules(oa::oaModule *x, oa::oaModule *y);
00486     static void             failIfInDifferentModules(ModRef x, ModRef y) {
00490         failIfInDifferentModules(x.module, y.module);
00491     }
00492     
00493     static oa::oaModule*    convertModRefListToRefList(const list<ModRef> & source,
00494                                                        list<BBRef> & result);
00495     static void             convertRefListToModRefList(const list<BBRef> & source,
00496                                                        oa::oaModule *module,
00497                                                        list<ModRef> & result);
00498     static void             convertRefVectorToModRefVector(const vector<BBRef> & source,
00499                                                            oa::oaModule *module,
00500                                                            vector<ModRef> & result);
00501 };
00502 
00503 }
00504 
00505 #endif

Generated on Mon Jul 9 14:17:20 2007 for OA Gear Fpga by  doxygen 1.3.9.1