oagTimerTimer.h

Go to the documentation of this file.
00001 /* (c) Copyright 2004-2005, Cadence Design Systems, Inc.  All rights reserved. 
00002 
00003 This file is part of the OA Gear distribution.  See the COPYING file in
00004 the top level OA Gear directory for copyright and licensing information. */
00005 
00006 /*
00007 Author: Zhong Xiu <zxiu@andrew.cmu.edu>
00008 
00009 ChangeLog:
00010 2004-09-15: ChangeLog started
00011 */
00012 
00013 #if !defined(oagTimerTimer_P)
00014 #define oagTimerTimer_P
00015 
00016 #include <iostream>
00017 #include "oaDesignDB.h"
00018 
00019 #include "oagTimerTPoint.h"
00020 //#include "oagTimerCellData.h"
00021 #include "oagTimerTPointMaster.h"
00022 #include <map>
00023 #include <set>
00024 #include <string>
00025 
00026 #include "oagTimerModel.h"
00027 #include "oagTimerLibData.h"
00028 #include "oagTimerLibParserInt.h"
00029 #include "oagTimerWireModel.h"
00030 #include "oagTimerElmoreWireModel.h"
00031 
00032 namespace oagTimer {
00033 
00034 // forward decls
00035 class TermObserver;
00036 class InstTermObserver;
00037 class ElmoreWireModel;
00038 
00043 typedef std::vector<std::pair<oaOccNet*, DelayType> > netsSlacks;
00050 typedef std::vector<std::pair<oaOccObject*, bool> > nodesSlopeDir;
00051 
00053 
00058 class Timer {
00059   friend class CellData;
00060   friend class DesignTool;
00061   friend class Opt;
00062   friend class TPoint;
00063   friend class Report;
00064   friend class TimerUnitTest;
00065   friend class Sensitivity;
00066   friend class DuetSensitivity;
00067   friend class Util;
00068   friend class TimerUtil;
00069   friend class KickMove;
00070   friend class SubTimer;
00071 
00072   /* To be removed */
00073   friend class PowerSenseOpt;
00074 
00076 
00077   public:
00078   
00081 
00082 
00084     Timer();
00085 
00087     ~Timer();
00088 
00090 
00093 
00094 
00105     void readLibrary(const char *filename,
00106                      const char *libertyLibname = 0,
00107                      const char *libertyViewname = 0);
00108 
00114     void add(oaDesign *design);
00115 
00116     void debug_TimingFlag(oaDesign *design);
00117 
00123     void remove(oaDesign *design);
00124 
00130     void readConstraints(const char *filename,
00131                          oaDesign   *design);
00132 
00133     //void createSwapList(oaDesign *design);
00134 
00138     void setWireModel(WireModel *model) {
00139         _wireModel = model;
00140         elmoreAnalysis = false;
00141     }
00142 
00146     void setWireModel(ElmoreWireModel *model){
00147         _elmoreWireModel = model;
00148         const char *tUnit = libParseData.tUnit;
00149         const char *capUnit = libParseData.capUnit;
00150         std::cout << "Time Unit: " << tUnit << std::endl;
00151         std::cout << "Cap Load Unit: " << capUnit << std::endl;
00152         _elmoreWireModel->setUnit(tUnit,capUnit);
00153         elmoreAnalysis = true;
00154     }
00155 
00158     void setSlewDegr(){
00159         slewDegr = true;
00160     }
00161 
00163     TimeType setWorstArr(oaDesign *design);
00164 
00166 
00169 
00170 
00177     DelayType getFullSlack(oaOccObject *oPtr);
00178     
00185     DelayType getSlack(oaOccObject *oPtr);
00186 
00193     TimeType getArr(oaOccObject *oPtr);
00194 
00201     TimeType getReq(oaOccObject *oPtr);
00202 
00209     TimeType getFallArr(oaOccObject *oPtr);
00210 
00217     TimeType getRiseArr(oaOccObject *oPtr);
00218 
00224     TimeType getFallReq(oaOccObject *oPtr);
00225 
00231     TimeType getRiseReq(oaOccObject *oPtr);
00232 
00239     DelayType getSlew(oaOccObject *oPtr);
00240 
00247     DelayType getFallSlew(oaOccObject *oPtr);
00248 
00255     DelayType getRiseSlew(oaOccObject *oPtr);
00256 
00258 
00259 
00261 
00262     DelayType getWorstSlack();
00263     DelayType getWorstArr();
00264     double getSetupTime(oaOccInstTerm *iTerm);
00265     
00266     // Check that timing is not violated at PO
00267     bool isValidTiming();
00268 
00269   public:
00273     DelayType getNetSlack(const oaOccNet *net);
00275 
00279     void findWorstPath(nodesSlopeDir & path);
00280     void fromPath(nodesSlopeDir & path, oaOccObject *block);
00281     void toPath(nodesSlopeDir & path, oaOccObject *block);
00282     void throughPath(nodesSlopeDir & path, oaOccObject *block);
00284 
00285     double getPeriod();
00286   public:
00287     static void invalidateFanout(oaOccNet *net);
00288     static void invalidateFanin(oaOccNet *net);
00289 /*To be removed*/
00290     void updateAll(){
00291         //std::cout << "UpdateAllTiming()" << std::endl;
00292         updateAllArr();
00293         updateAllReq();
00294     }
00295   private:
00296     static void invalidateAllFanin(oaOccInst *inst);
00297 
00298   private:
00304     void updateArr(oaOccObject *block);
00305     void updateClockArr(oaOccObject *block);
00306     oaOccNet* getOccNet(oaOccObject *block);
00307     void updateNetPathReq(TPoint *p, TPoint *tp);
00308     void initReq(oaOccObject *block);
00309     void initPOReq(oaOccObject *block);
00310     void initPIArr(oaOccObject *block);
00311     void initClockPIArr(oaOccObject *block);
00312     void updateNetLoadDelay(oaOccObject *block);
00313     void updateNetArr(oaOccObject *block);
00314     void updateClockNetArr(oaOccObject *block);
00315     void updateCellArr(oaOccObject *block);
00316     void updateClockCellArr(oaOccObject *block);
00317     void updateNetReq(oaOccObject *block);
00318     void updateCellReq(oaOccObject *block);
00319     void takeWorstSlew(oaOccObject *block);
00320     int  getClockIndex(oaOccObject *block);
00321     void setMultiCyclePaths(oaOccObject *block); 
00322     bool timingDataCompare(std::vector<timingData*> &v1, std::vector<timingData*> &v2);
00323     void timingDataCopy(std::vector<timingData*> &v1, std::vector<timingData*> &v2);
00324     void slewDataCopy(TPoint *p); 
00325     void insertTimingData(std::vector<timingData*> &timingDataVector, timingData *d);
00326     int  findTimingData (TPoint *p, int clockIndex);
00327     void updateNetPathArr(TPoint *p, TPoint *tp);
00328     void updateClockNetPathArr(TPoint *p, TPoint *tp);
00329     void setMultiCycleConstraint(oaOccObject *block);
00330     DelayType greatestCommonDivider(DelayType d1, DelayType d2);
00331     std::string getBlockName(oaOccObject *block);
00332     void setSlewTimingValidOpt(TPoint *p); 
00333     void clearVector(std::vector<timingData*> &v); 
00334     void initVector(std::vector<timingData*> &v);
00335     //int createNewClock(int x);
00336 
00337     void updateCellPathReq(TPointMaster::pathVector::iterator i, 
00338                            TPoint *p,
00339                            oaOccInstTerm *other);
00340 
00341    void updateCellPathArr(TPointMaster *tm,
00342             TPoint *p, 
00343             TPointMaster::pathVector::iterator i, 
00344             TPoint *tp);
00345 
00346    bool updateClockCellPathArr(TPointMaster *tm,
00347             TPoint *p, 
00348             TPointMaster::pathVector::iterator i, 
00349             TPoint *tp);
00350 
00351     void updateReq(oaOccObject *block);
00352     void updateAllArr();
00353     void updateAllReq();
00355 
00356     void fromPath(nodesSlopeDir & path, oaOccObject *block,
00357                   bool isStartingClock);
00358     void toPath(nodesSlopeDir & path, oaOccObject *block,
00359                 bool isEndingClock);
00360     void compareSlack(oaOccObject *block, bool currentRise,
00361                       TPoint *tp, bool & isRise,
00362                       DelayType & worstSlack, 
00363                       oaOccObject * & blockWithWorstSlack);
00364 
00365   private:
00367     std::set<oaOccObject *> clockPins;  
00368 
00370     TermObserver *_termCB;
00372     InstTermObserver *_instTermCB;
00374     oaScalarName stdLib;
00375 
00376 
00378 
00379   private:
00380     WireModel *_wireModel;
00381     ElmoreWireModel *_elmoreWireModel;
00382     bool elmoreAnalysis;
00383     std::set<oaDesign *> _watchedDesigns;
00384     bool slewDegr;
00385     TimeType worstArr;
00386 
00387     //To be removed
00388     oaDesign *dsgn;
00389 
00390   public:
00391     static oaOccObject *findOccObj(oaOccurrence *occ, std::string name);
00392     static oaOccInstTerm *getOccFromMod(oaOccInst *inst, oaModTerm *term);
00393 
00394     // Use to enable incremental timing speedup by propagating stored slew and delay
00395     // values
00396     // This happen only when input slew does not change by certain percentage
00397     bool optIncrTimer;
00398     
00399     void clearDesignTimingData();
00400     void printCell(oaOccInst *i);
00401     void printDetailTiming();
00402     void printAll();
00403     void printAllPO();
00404     void checkRatFlags();
00405 
00407 
00408 };
00409 
00410 }
00411 
00412 #endif

Generated on Thu Aug 25 14:24:05 2011 by  doxygen 1.3.9.1