00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
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
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
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
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
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
00290 void updateAll(){
00291
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
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
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
00395
00396
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