00001
00002
00003
00004
00005
00006
00007
00008
00009 #if !defined(oagTimerSubTimer_H)
00010 #define oagTimerSubTimer_H
00011
00012 #include "oaDesignDB.h"
00013 #include "oagTimerTimer.h"
00014
00015 #include <map>
00016 #include <vector>
00017
00018 namespace oagTimer {
00019 using namespace std;
00020 using namespace oa;
00021
00022 class SubTPoint{
00023 public:
00024 SubTPoint();
00025 ~SubTPoint();
00026 double getArr();
00027 double getReq();
00028 double getSlew();
00029 double getSlack();
00030 double getRiseSlack();
00031 double getFallSlack();
00032
00033 public:
00034 double delay;
00035 double riseArr;
00036 double fallArr;
00037 double riseReq;
00038 double fallReq;
00039 double riseSlew;
00040 double fallSlew;
00041 };
00042
00043 class SubTimer{
00044 public:
00045 SubTimer(oaDesign *des, Timer *t, oaOccInst *i, oaString c);
00046 ~SubTimer();
00047
00048 void setLoad(double l);
00049 double getCellDelayEstimate(oaOccInstTerm *i);
00050 double getDeltaDelay();
00051 double getDeltaSlack();
00052 double getWorstSlack();
00053
00054 private:
00055 SubTPoint getSubTP(oaOccInstTerm *i);
00056 void buildTimingGraph();
00057 double getDeltaArr(oaOccInstTerm *it);
00058 double getMinDeltaSlack(oaOccInst *i);
00059 double getDeltaSlack(oaOccInstTerm *it);
00060 void getOtherInsts(oaOccInstTerm *i);
00061
00062 void updateArr();
00063 double getCapLoad(oaOccInstTerm *i, oaString otherSize);
00064 void computeArr(oaOccInstTerm *inpTerm, oaString cellMaster, double load);
00065 void getOtherArr(oaOccInstTerm *instTerm);
00066
00067 void updateReq();
00068 void computeReq(oaOccInstTerm *inpTerm, oaString cellMaster, double load);
00069 void getOtherReq(oaOccInstTerm *instTerm, SubTPoint &subTP);
00070
00071
00072
00073
00074 void printAll();
00075 void print(oaOccInstTerm *i);
00076 private:
00077 oaDesign *design;
00078 Timer *timer;
00079
00080 oaOccInst *occInst;
00081 oaString masterCell;
00082 double currLoad;
00083 bool loadGiven;
00084
00085 map<oaOccInstTerm*,SubTPoint> tpMap;
00086 vector<oaOccInst*> faninVec;
00087 vector<oaOccInst*> fanoutVec;
00088 };
00089
00090 }
00091 #endif