ADDF.cc revision 10447:a465576671d4
1#include "model/std_cells/ADDF.h" 2 3#include <cmath> 4 5#include "model/PortInfo.h" 6#include "model/EventInfo.h" 7#include "model/TransitionInfo.h" 8#include "model/std_cells/StdCellLib.h" 9#include "model/std_cells/CellMacros.h" 10#include "model/timing_graph/ElectricalNet.h" 11#include "model/timing_graph/ElectricalDriver.h" 12#include "model/timing_graph/ElectricalLoad.h" 13#include "model/timing_graph/ElectricalDelay.h" 14 15namespace DSENT 16{ 17 using std::ceil; 18 using std::max; 19 20 ADDF::ADDF(const String& instance_name_, const TechModel* tech_model_) 21 : StdCell(instance_name_, tech_model_) 22 { 23 initParameters(); 24 initProperties(); 25 } 26 27 ADDF::~ADDF() 28 {} 29 30 void ADDF::initProperties() 31 { 32 return; 33 } 34 35 void ADDF::constructModel() 36 { 37 // All constructModel should do is create Area/NDDPower/Energy Results as 38 // well as instantiate any sub-instances using only the hard parameters 39 40 createInputPort("A"); 41 createInputPort("B"); 42 createInputPort("CI"); 43 createOutputPort("S"); 44 createOutputPort("CO"); 45 46 createLoad("A_Cap"); 47 createLoad("B_Cap"); 48 createLoad("CI_Cap"); 49 createDelay("A_to_S_delay"); 50 createDelay("B_to_S_delay"); 51 createDelay("CI_to_S_delay"); 52 createDelay("A_to_CO_delay"); 53 createDelay("B_to_CO_delay"); 54 createDelay("CI_to_CO_delay"); 55 createDriver("S_Ron", true); 56 createDriver("CO_Ron", true); 57 58 ElectricalLoad* a_cap = getLoad("A_Cap"); 59 ElectricalLoad* b_cap = getLoad("B_Cap"); 60 ElectricalLoad* ci_cap = getLoad("CI_Cap"); 61 ElectricalDelay* a_to_s_delay = getDelay("A_to_S_delay"); 62 ElectricalDelay* b_to_s_delay = getDelay("B_to_S_delay"); 63 ElectricalDelay* ci_to_s_delay = getDelay("CI_to_S_delay"); 64 ElectricalDelay* a_to_co_delay = getDelay("A_to_CO_delay"); 65 ElectricalDelay* b_to_co_delay = getDelay("B_to_CO_delay"); 66 ElectricalDelay* ci_to_co_delay = getDelay("CI_to_CO_delay"); 67 ElectricalDriver* s_ron = getDriver("S_Ron"); 68 ElectricalDriver* co_ron = getDriver("CO_Ron"); 69 70 getNet("A")->addDownstreamNode(a_cap); 71 getNet("B")->addDownstreamNode(b_cap); 72 getNet("CI")->addDownstreamNode(ci_cap); 73 a_cap->addDownstreamNode(a_to_s_delay); 74 b_cap->addDownstreamNode(b_to_s_delay); 75 ci_cap->addDownstreamNode(ci_to_s_delay); 76 a_cap->addDownstreamNode(a_to_co_delay); 77 b_cap->addDownstreamNode(b_to_co_delay); 78 ci_cap->addDownstreamNode(ci_to_co_delay); 79 80 a_to_s_delay->addDownstreamNode(s_ron); 81 b_to_s_delay->addDownstreamNode(s_ron); 82 ci_to_s_delay->addDownstreamNode(s_ron); 83 a_to_co_delay->addDownstreamNode(co_ron); 84 b_to_co_delay->addDownstreamNode(co_ron); 85 ci_to_co_delay->addDownstreamNode(co_ron); 86 87 s_ron->addDownstreamNode(getNet("S")); 88 co_ron->addDownstreamNode(getNet("CO")); 89 90 // Create Area result 91 // Create NDD Power result 92 createElectricalAtomicResults(); 93 // Create ADDF Event Energy Result 94 createElectricalEventAtomicResult("ADDF"); 95 96 getEventInfo("Idle")->setStaticTransitionInfos(); 97 98 return; 99 } 100 101 void ADDF::updateModel() 102 { 103 // Get parameters 104 double drive_strength = getDrivingStrength(); 105 Map<double>* cache = getTechModel()->getStdCellLib()->getStdCellCache(); 106 107 // Standard cell cache string 108 String cell_name = "ADDF_X" + (String) drive_strength; 109 110 // Get timing parameters 111 getLoad("A_Cap")->setLoadCap(cache->get(cell_name + "->Cap->A")); 112 getLoad("B_Cap")->setLoadCap(cache->get(cell_name + "->Cap->B")); 113 getLoad("CI_Cap")->setLoadCap(cache->get(cell_name + "->Cap->CI")); 114 115 getDelay("A_to_S_delay")->setDelay(cache->get(cell_name + "->Delay->A_to_S")); 116 getDelay("B_to_S_delay")->setDelay(cache->get(cell_name + "->Delay->B_to_S")); 117 getDelay("CI_to_S_delay")->setDelay(cache->get(cell_name + "->Delay->CI_to_S")); 118 getDelay("A_to_CO_delay")->setDelay(cache->get(cell_name + "->Delay->A_to_CO")); 119 getDelay("B_to_CO_delay")->setDelay(cache->get(cell_name + "->Delay->B_to_CO")); 120 getDelay("CI_to_CO_delay")->setDelay(cache->get(cell_name + "->Delay->CI_to_CO")); 121 122 getDriver("S_Ron")->setOutputRes(cache->get(cell_name + "->DriveRes->S")); 123 getDriver("CO_Ron")->setOutputRes(cache->get(cell_name + "->DriveRes->CO")); 124 125 // Set the cell area 126 getAreaResult("Active")->setValue(cache->get(cell_name + "->Area->Active")); 127 getAreaResult("Metal1Wire")->setValue(cache->get(cell_name + "->Area->Metal1Wire")); 128 129 return; 130 } 131 132 void ADDF::evaluateModel() 133 { 134 return; 135 } 136 137 void ADDF::useModel() 138 { 139 // Get parameters 140 double drive_strength = getDrivingStrength(); 141 Map<double>* cache = getTechModel()->getStdCellLib()->getStdCellCache(); 142 143 // Standard cell cache string 144 String cell_name = "ADDF_X" + (String) drive_strength; 145 146 // Propagate the transition info and get the 0->1 transition count 147 propagateTransitionInfo(); 148 double P_A = getInputPort("A")->getTransitionInfo().getProbability1(); 149 double P_B = getInputPort("B")->getTransitionInfo().getProbability1(); 150 double P_CI = getInputPort("CI")->getTransitionInfo().getProbability1(); 151 double A_num_trans_01 = getInputPort("A")->getTransitionInfo().getNumberTransitions01(); 152 double B_num_trans_01 = getInputPort("B")->getTransitionInfo().getNumberTransitions01(); 153 double CI_num_trans_01 = getInputPort("CI")->getTransitionInfo().getNumberTransitions01(); 154 double P_num_trans_01 = m_trans_P_.getNumberTransitions01(); 155 double G_num_trans_01 = m_trans_G_.getNumberTransitions01(); 156 double CP_num_trans_01 = m_trans_CP_.getNumberTransitions01(); 157 double S_num_trans_01 = getOutputPort("S")->getTransitionInfo().getNumberTransitions01(); 158 double CO_num_trans_01 = getOutputPort("CO")->getTransitionInfo().getNumberTransitions01(); 159 160 // Calculate leakage 161 double leakage = 0; 162 leakage += cache->get(cell_name + "->Leakage->!A!B!CI") * (1 - P_A) * (1 - P_B) * (1 - P_CI); 163 leakage += cache->get(cell_name + "->Leakage->!A!BCI") * (1 - P_A) * (1 - P_B) * P_CI; 164 leakage += cache->get(cell_name + "->Leakage->!AB!CI") * (1 - P_A) * P_B * (1 - P_CI); 165 leakage += cache->get(cell_name + "->Leakage->!ABCI") * (1 - P_A) * P_B * P_CI; 166 leakage += cache->get(cell_name + "->Leakage->A!B!CI") * P_A * (1 - P_B) * (1 - P_CI); 167 leakage += cache->get(cell_name + "->Leakage->A!BCI") * P_A * (1 - P_B) * P_CI; 168 leakage += cache->get(cell_name + "->Leakage->AB!CI") * P_A * P_B * (1 - P_CI); 169 leakage += cache->get(cell_name + "->Leakage->ABCI") * P_A * P_B * P_CI; 170 getNddPowerResult("Leakage")->setValue(leakage); 171 172 // Get VDD 173 double vdd = getTechModel()->get("Vdd"); 174 175 // Get capacitances 176 double a_b_cap = cache->get(cell_name + "->Cap->A_b"); 177 double b_b_cap = cache->get(cell_name + "->Cap->B_b"); 178 double ci_b_cap = cache->get(cell_name + "->Cap->CI_b"); 179 double p_cap = cache->get(cell_name + "->Cap->P"); 180 double p_b_cap = cache->get(cell_name + "->Cap->P_b"); 181 double s_cap = cache->get(cell_name + "->Cap->S"); 182 double cp_cap = cache->get(cell_name + "->Cap->CP"); 183 double g_cap = cache->get(cell_name + "->Cap->G"); 184 double co_cap = cache->get(cell_name + "->Cap->CO"); 185 double s_load_cap = getNet("S")->getTotalDownstreamCap(); 186 double co_load_cap = getNet("CO")->getTotalDownstreamCap(); 187 188 // Calculate ADDF Event energy 189 double addf_event_energy = 0.0; 190 addf_event_energy += a_b_cap * A_num_trans_01; 191 addf_event_energy += b_b_cap * B_num_trans_01; 192 addf_event_energy += ci_b_cap * CI_num_trans_01; 193 addf_event_energy += (p_cap + p_b_cap) * P_num_trans_01; 194 addf_event_energy += (s_cap + s_load_cap) * S_num_trans_01; 195 addf_event_energy += cp_cap * CP_num_trans_01; 196 addf_event_energy += g_cap * G_num_trans_01; 197 addf_event_energy += (co_cap + co_load_cap) * CO_num_trans_01; 198 addf_event_energy *= vdd * vdd; 199 getEventResult("ADDF")->setValue(addf_event_energy); 200 201 return; 202 } 203 204 void ADDF::propagateTransitionInfo() 205 { 206 const TransitionInfo& trans_A = getInputPort("A")->getTransitionInfo(); 207 const TransitionInfo& trans_B = getInputPort("B")->getTransitionInfo(); 208 const TransitionInfo& trans_CI = getInputPort("CI")->getTransitionInfo(); 209 210 double max_freq_mult = max(max(trans_A.getFrequencyMultiplier(), trans_B.getFrequencyMultiplier()), trans_CI.getFrequencyMultiplier()); 211 const TransitionInfo& scaled_trans_A = trans_A.scaleFrequencyMultiplier(max_freq_mult); 212 const TransitionInfo& scaled_trans_B = trans_B.scaleFrequencyMultiplier(max_freq_mult); 213 const TransitionInfo& scaled_trans_CI = trans_CI.scaleFrequencyMultiplier(max_freq_mult); 214 215 double A_prob_00 = scaled_trans_A.getNumberTransitions00() / max_freq_mult; 216 double A_prob_01 = scaled_trans_A.getNumberTransitions01() / max_freq_mult; 217 double A_prob_10 = A_prob_01; 218 double A_prob_11 = scaled_trans_A.getNumberTransitions11() / max_freq_mult; 219 double B_prob_00 = scaled_trans_B.getNumberTransitions00() / max_freq_mult; 220 double B_prob_01 = scaled_trans_B.getNumberTransitions01() / max_freq_mult; 221 double B_prob_10 = B_prob_01; 222 double B_prob_11 = scaled_trans_B.getNumberTransitions11() / max_freq_mult; 223 double CI_prob_00 = scaled_trans_CI.getNumberTransitions00() / max_freq_mult; 224 double CI_prob_01 = scaled_trans_CI.getNumberTransitions01() / max_freq_mult; 225 double CI_prob_10 = CI_prob_01; 226 double CI_prob_11 = scaled_trans_CI.getNumberTransitions11() / max_freq_mult; 227 228 // Set P transition info 229 double P_prob_00 = A_prob_00 * B_prob_00 + 230 A_prob_01 * B_prob_01 + 231 A_prob_10 * B_prob_10 + 232 A_prob_11 * B_prob_11; 233 double P_prob_01 = A_prob_00 * B_prob_01 + 234 A_prob_01 * B_prob_00 + 235 A_prob_10 * B_prob_11 + 236 A_prob_11 * B_prob_10; 237 double P_prob_10 = P_prob_01; 238 double P_prob_11 = A_prob_00 * B_prob_11 + 239 A_prob_01 * B_prob_10 + 240 A_prob_10 * B_prob_01 + 241 A_prob_11 * B_prob_00; 242 243 // Set G transition info 244 double G_prob_00 = A_prob_11 * B_prob_11; 245 double G_prob_01 = A_prob_11 * B_prob_10 + 246 A_prob_10 * (B_prob_11 + B_prob_10); 247 double G_prob_10 = G_prob_01; 248 double G_prob_11 = A_prob_00 + 249 A_prob_01 * (B_prob_00 + B_prob_10) + 250 A_prob_10 * (B_prob_00 + B_prob_01) + 251 A_prob_11 * B_prob_00; 252 253 // Set CP transition info 254 double CP_prob_00 = P_prob_11 * CI_prob_11; 255 double CP_prob_01 = P_prob_11 * CI_prob_10 + 256 P_prob_10 * (CI_prob_11 + CI_prob_10); 257 double CP_prob_10 = CP_prob_01; 258 double CP_prob_11 = P_prob_00 + 259 P_prob_01 * (CI_prob_00 + CI_prob_10) + 260 P_prob_10 * (CI_prob_00 + CI_prob_01) + 261 P_prob_11 * CI_prob_00; 262 263 // Set S transition info 264 double S_prob_00 = P_prob_00 * CI_prob_00 + 265 P_prob_01 * CI_prob_01 + 266 P_prob_10 * CI_prob_10 + 267 P_prob_11 * CI_prob_11; 268 double S_prob_01 = P_prob_00 * CI_prob_01 + 269 P_prob_01 * CI_prob_00 + 270 P_prob_10 * CI_prob_11 + 271 P_prob_11 * CI_prob_10; 272 double S_prob_11 = P_prob_00 * CI_prob_11 + 273 P_prob_01 * CI_prob_10 + 274 P_prob_10 * CI_prob_01 + 275 P_prob_11 * CI_prob_00; 276 277 // Set CO transition info 278 double CO_prob_00 = G_prob_11 * CP_prob_11; 279 double CO_prob_01 = G_prob_11 * CP_prob_10 + 280 G_prob_10 * (CP_prob_11 + CP_prob_10); 281 double CO_prob_11 = G_prob_00 + 282 G_prob_01 * (CP_prob_00 + CP_prob_10) + 283 G_prob_10 * (CP_prob_00 + CP_prob_01) + 284 G_prob_11 * CP_prob_00; 285 286 m_trans_P_ = TransitionInfo(P_prob_00 * max_freq_mult, P_prob_01 * max_freq_mult, P_prob_11 * max_freq_mult); 287 m_trans_G_ = TransitionInfo(G_prob_00 * max_freq_mult, G_prob_01 * max_freq_mult, G_prob_11 * max_freq_mult); 288 m_trans_CP_ = TransitionInfo(CP_prob_00 * max_freq_mult, CP_prob_01 * max_freq_mult, CP_prob_11 * max_freq_mult); 289 290 // Check that probabilities add up to 1.0 with some finite tolerance 291 ASSERT(LibUtil::Math::isEqual((S_prob_00 + S_prob_01 + S_prob_01 + S_prob_11), 1.0), 292 "[Error] " + getInstanceName() + "Output S transition probabilities must add up to 1 (" + 293 (String) S_prob_00 + ", " + (String) S_prob_01 + ", " + (String) S_prob_11 + ")!"); 294 295 // Check that probabilities add up to 1.0 with some finite tolerance 296 ASSERT(LibUtil::Math::isEqual((CO_prob_00 + CO_prob_01 + CO_prob_01 + CO_prob_11), 1.0), 297 "[Error] " + getInstanceName() + "Output S transition probabilities must add up to 1 (" + 298 (String) CO_prob_00 + ", " + (String) CO_prob_01 + ", " + (String) CO_prob_11 + ")!"); 299 300 // Turn probability of transitions per cycle into number of transitions per time unit 301 TransitionInfo trans_S(S_prob_00 * max_freq_mult, S_prob_01 * max_freq_mult, S_prob_11 * max_freq_mult); 302 getOutputPort("S")->setTransitionInfo(trans_S); 303 TransitionInfo trans_CO(CO_prob_00 * max_freq_mult, CO_prob_01 * max_freq_mult, CO_prob_11 * max_freq_mult); 304 getOutputPort("CO")->setTransitionInfo(trans_CO); 305 return; 306 } 307 308 // Creates the standard cell, characterizes and abstracts away the details 309 void ADDF::cacheStdCell(StdCellLib* cell_lib_, double drive_strength_) 310 { 311 // Get parameters 312 double gate_pitch = cell_lib_->getTechModel()->get("Gate->PitchContacted"); 313 Map<double>* cache = cell_lib_->getStdCellCache(); 314 315 // Standard cell cache string 316 String cell_name = "ADDF_X" + (String) drive_strength_; 317 318 Log::printLine("=== " + cell_name + " ==="); 319 320 // Now actually build the full standard cell model 321 createInputPort("A"); 322 createInputPort("B"); 323 createInputPort("CI"); 324 createOutputPort("S"); 325 createOutputPort("CO"); 326 327 createNet("A_b"); 328 createNet("B_b"); 329 createNet("CI_b"); 330 createNet("P"); 331 createNet("P_b"); 332 createNet("G"); //actually G_b since it is NAND'ed 333 createNet("CP"); //actually (CP)_b since it is NAND'ed 334 335 // Adds macros 336 CellMacros::addInverter(this, "INV1", false, true, "A", "A_b"); 337 CellMacros::addInverter(this, "INV2", false, true, "B", "B_b"); 338 CellMacros::addInverter(this, "INV3", false, true, "CI", "CI_b"); 339 CellMacros::addInverter(this, "INV4", false, true, "P", "P_b"); 340 CellMacros::addTristate(this, "INVZ1", false, true, true, true, "B", "A", "A_b", "P"); 341 CellMacros::addTristate(this, "INVZ2", false, true, true, true, "B_b", "A_b", "A", "P"); 342 CellMacros::addTristate(this, "INVZ3", true, true, true, true, "P", "CI", "CI_b", "S"); 343 CellMacros::addTristate(this, "INVZ4", true, true, true, true, "P_b", "CI_b", "CI", "S"); 344 CellMacros::addNand2(this, "NAND1", false, true, true, "CI", "P", "CP"); 345 CellMacros::addNand2(this, "NAND2", false, true, true, "A", "B", "G"); 346 CellMacros::addNand2(this, "NAND3", true, true, true, "CP", "G", "CO"); 347 348 // I have no idea how to size each of the parts haha 349 CellMacros::updateInverter(this, "INV1", drive_strength_ * 0.250); 350 CellMacros::updateInverter(this, "INV2", drive_strength_ * 0.250); 351 CellMacros::updateInverter(this, "INV3", drive_strength_ * 0.250); 352 CellMacros::updateInverter(this, "INV4", drive_strength_ * 0.500); 353 CellMacros::updateTristate(this, "INVZ1", drive_strength_ * 0.250); 354 CellMacros::updateTristate(this, "INVZ2", drive_strength_ * 0.250); 355 CellMacros::updateTristate(this, "INVZ3", drive_strength_ * 0.500); 356 CellMacros::updateTristate(this, "INVZ4", drive_strength_ * 0.500); 357 CellMacros::updateNand2(this, "NAND1", drive_strength_ * 0.500); 358 CellMacros::updateNand2(this, "NAND2", drive_strength_ * 0.500); 359 CellMacros::updateNand2(this, "NAND3", drive_strength_ * 1.000); 360 361 // Cache area result 362 double area = 0.0; 363 area += gate_pitch * getTotalHeight() * 1; 364 area += gate_pitch * getTotalHeight() * getGenProperties()->get("INV1_GatePitches").toDouble(); 365 area += gate_pitch * getTotalHeight() * getGenProperties()->get("INV2_GatePitches").toDouble(); 366 area += gate_pitch * getTotalHeight() * getGenProperties()->get("INV3_GatePitches").toDouble(); 367 area += gate_pitch * getTotalHeight() * getGenProperties()->get("INV4_GatePitches").toDouble(); 368 area += gate_pitch * getTotalHeight() * getGenProperties()->get("INVZ1_GatePitches").toDouble(); 369 area += gate_pitch * getTotalHeight() * getGenProperties()->get("INVZ2_GatePitches").toDouble(); 370 area += gate_pitch * getTotalHeight() * getGenProperties()->get("INVZ3_GatePitches").toDouble(); 371 area += gate_pitch * getTotalHeight() * getGenProperties()->get("INVZ4_GatePitches").toDouble(); 372 area += gate_pitch * getTotalHeight() * getGenProperties()->get("NAND1_GatePitches").toDouble(); 373 area += gate_pitch * getTotalHeight() * getGenProperties()->get("NAND2_GatePitches").toDouble(); 374 area += gate_pitch * getTotalHeight() * getGenProperties()->get("NAND3_GatePitches").toDouble(); 375 cache->set(cell_name + "->Area->Active", area); 376 cache->set(cell_name + "->Area->Metal1Wire", area); 377 Log::printLine(cell_name + "->Area->Active=" + (String) area); 378 Log::printLine(cell_name + "->Area->Metal1Wire=" + (String) area); 379 380 // -------------------------------------------------------------------- 381 // Leakage Model Calculation 382 // -------------------------------------------------------------------- 383 // Cache leakage power results (for every single signal combination) 384 double leakage_000 = 0; //!A, !B, !CI 385 double leakage_001 = 0; //!A, !B, CI 386 double leakage_010 = 0; //!A, B, !CI 387 double leakage_011 = 0; //!A, B, CI 388 double leakage_100 = 0; //A, !B, !CI 389 double leakage_101 = 0; //A, !B, CI 390 double leakage_110 = 0; //A, B, !CI 391 double leakage_111 = 0; //A, B, CI 392 393 //This is so painful... 394 leakage_000 += getGenProperties()->get("INV1_LeakagePower_0").toDouble(); 395 leakage_000 += getGenProperties()->get("INV2_LeakagePower_0").toDouble(); 396 leakage_000 += getGenProperties()->get("INV3_LeakagePower_0").toDouble(); 397 leakage_000 += getGenProperties()->get("INV4_LeakagePower_0").toDouble(); 398 leakage_000 += getGenProperties()->get("INVZ1_LeakagePower_010_0").toDouble(); 399 leakage_000 += getGenProperties()->get("INVZ2_LeakagePower_101_0").toDouble(); 400 leakage_000 += getGenProperties()->get("INVZ3_LeakagePower_010_0").toDouble(); 401 leakage_000 += getGenProperties()->get("INVZ4_LeakagePower_101_0").toDouble(); 402 leakage_000 += getGenProperties()->get("NAND1_LeakagePower_00").toDouble(); 403 leakage_000 += getGenProperties()->get("NAND2_LeakagePower_00").toDouble(); 404 leakage_000 += getGenProperties()->get("NAND3_LeakagePower_11").toDouble(); 405 406 leakage_001 += getGenProperties()->get("INV1_LeakagePower_0").toDouble(); 407 leakage_001 += getGenProperties()->get("INV2_LeakagePower_0").toDouble(); 408 leakage_001 += getGenProperties()->get("INV3_LeakagePower_1").toDouble(); 409 leakage_001 += getGenProperties()->get("INV4_LeakagePower_0").toDouble(); 410 leakage_001 += getGenProperties()->get("INVZ1_LeakagePower_010_0").toDouble(); 411 leakage_001 += getGenProperties()->get("INVZ2_LeakagePower_101_0").toDouble(); 412 leakage_001 += getGenProperties()->get("INVZ3_LeakagePower_100_1").toDouble(); 413 leakage_001 += getGenProperties()->get("INVZ4_LeakagePower_011_1").toDouble(); 414 leakage_001 += getGenProperties()->get("NAND1_LeakagePower_10").toDouble(); 415 leakage_001 += getGenProperties()->get("NAND2_LeakagePower_00").toDouble(); 416 leakage_001 += getGenProperties()->get("NAND3_LeakagePower_11").toDouble(); 417 418 leakage_010 += getGenProperties()->get("INV1_LeakagePower_0").toDouble(); 419 leakage_010 += getGenProperties()->get("INV2_LeakagePower_1").toDouble(); 420 leakage_010 += getGenProperties()->get("INV3_LeakagePower_0").toDouble(); 421 leakage_010 += getGenProperties()->get("INV4_LeakagePower_1").toDouble(); 422 leakage_010 += getGenProperties()->get("INVZ1_LeakagePower_011_1").toDouble(); 423 leakage_010 += getGenProperties()->get("INVZ2_LeakagePower_100_1").toDouble(); 424 leakage_010 += getGenProperties()->get("INVZ3_LeakagePower_011_1").toDouble(); 425 leakage_010 += getGenProperties()->get("INVZ4_LeakagePower_100_1").toDouble(); 426 leakage_010 += getGenProperties()->get("NAND1_LeakagePower_01").toDouble(); 427 leakage_010 += getGenProperties()->get("NAND2_LeakagePower_01").toDouble(); 428 leakage_010 += getGenProperties()->get("NAND3_LeakagePower_11").toDouble(); 429 430 leakage_011 += getGenProperties()->get("INV1_LeakagePower_0").toDouble(); 431 leakage_011 += getGenProperties()->get("INV2_LeakagePower_1").toDouble(); 432 leakage_011 += getGenProperties()->get("INV3_LeakagePower_1").toDouble(); 433 leakage_011 += getGenProperties()->get("INV4_LeakagePower_1").toDouble(); 434 leakage_011 += getGenProperties()->get("INVZ1_LeakagePower_011_1").toDouble(); 435 leakage_011 += getGenProperties()->get("INVZ2_LeakagePower_100_1").toDouble(); 436 leakage_011 += getGenProperties()->get("INVZ3_LeakagePower_101_0").toDouble(); 437 leakage_011 += getGenProperties()->get("INVZ4_LeakagePower_010_0").toDouble(); 438 leakage_011 += getGenProperties()->get("NAND1_LeakagePower_11").toDouble(); 439 leakage_011 += getGenProperties()->get("NAND2_LeakagePower_01").toDouble(); 440 leakage_011 += getGenProperties()->get("NAND3_LeakagePower_01").toDouble(); 441 442 leakage_100 += getGenProperties()->get("INV1_LeakagePower_1").toDouble(); 443 leakage_100 += getGenProperties()->get("INV2_LeakagePower_0").toDouble(); 444 leakage_100 += getGenProperties()->get("INV3_LeakagePower_0").toDouble(); 445 leakage_100 += getGenProperties()->get("INV4_LeakagePower_1").toDouble(); 446 leakage_100 += getGenProperties()->get("INVZ1_LeakagePower_100_1").toDouble(); 447 leakage_100 += getGenProperties()->get("INVZ2_LeakagePower_011_1").toDouble(); 448 leakage_100 += getGenProperties()->get("INVZ3_LeakagePower_011_1").toDouble(); 449 leakage_100 += getGenProperties()->get("INVZ4_LeakagePower_100_1").toDouble(); 450 leakage_100 += getGenProperties()->get("NAND1_LeakagePower_01").toDouble(); 451 leakage_100 += getGenProperties()->get("NAND2_LeakagePower_10").toDouble(); 452 leakage_100 += getGenProperties()->get("NAND3_LeakagePower_11").toDouble(); 453 454 leakage_101 += getGenProperties()->get("INV1_LeakagePower_1").toDouble(); 455 leakage_101 += getGenProperties()->get("INV2_LeakagePower_0").toDouble(); 456 leakage_101 += getGenProperties()->get("INV3_LeakagePower_1").toDouble(); 457 leakage_101 += getGenProperties()->get("INV4_LeakagePower_1").toDouble(); 458 leakage_101 += getGenProperties()->get("INVZ1_LeakagePower_100_1").toDouble(); 459 leakage_101 += getGenProperties()->get("INVZ2_LeakagePower_011_1").toDouble(); 460 leakage_101 += getGenProperties()->get("INVZ3_LeakagePower_101_0").toDouble(); 461 leakage_101 += getGenProperties()->get("INVZ4_LeakagePower_010_0").toDouble(); 462 leakage_101 += getGenProperties()->get("NAND1_LeakagePower_11").toDouble(); 463 leakage_101 += getGenProperties()->get("NAND2_LeakagePower_10").toDouble(); 464 leakage_101 += getGenProperties()->get("NAND3_LeakagePower_01").toDouble(); 465 466 leakage_110 += getGenProperties()->get("INV1_LeakagePower_1").toDouble(); 467 leakage_110 += getGenProperties()->get("INV2_LeakagePower_1").toDouble(); 468 leakage_110 += getGenProperties()->get("INV3_LeakagePower_0").toDouble(); 469 leakage_110 += getGenProperties()->get("INV4_LeakagePower_0").toDouble(); 470 leakage_110 += getGenProperties()->get("INVZ1_LeakagePower_101_0").toDouble(); 471 leakage_110 += getGenProperties()->get("INVZ2_LeakagePower_010_0").toDouble(); 472 leakage_110 += getGenProperties()->get("INVZ3_LeakagePower_010_0").toDouble(); 473 leakage_110 += getGenProperties()->get("INVZ4_LeakagePower_101_0").toDouble(); 474 leakage_110 += getGenProperties()->get("NAND1_LeakagePower_00").toDouble(); 475 leakage_110 += getGenProperties()->get("NAND2_LeakagePower_11").toDouble(); 476 leakage_110 += getGenProperties()->get("NAND3_LeakagePower_10").toDouble(); 477 478 leakage_111 += getGenProperties()->get("INV1_LeakagePower_1").toDouble(); 479 leakage_111 += getGenProperties()->get("INV2_LeakagePower_1").toDouble(); 480 leakage_111 += getGenProperties()->get("INV3_LeakagePower_1").toDouble(); 481 leakage_111 += getGenProperties()->get("INV4_LeakagePower_0").toDouble(); 482 leakage_111 += getGenProperties()->get("INVZ1_LeakagePower_101_0").toDouble(); 483 leakage_111 += getGenProperties()->get("INVZ2_LeakagePower_010_0").toDouble(); 484 leakage_111 += getGenProperties()->get("INVZ3_LeakagePower_100_1").toDouble(); 485 leakage_111 += getGenProperties()->get("INVZ4_LeakagePower_011_1").toDouble(); 486 leakage_111 += getGenProperties()->get("NAND1_LeakagePower_10").toDouble(); 487 leakage_111 += getGenProperties()->get("NAND2_LeakagePower_11").toDouble(); 488 leakage_111 += getGenProperties()->get("NAND3_LeakagePower_10").toDouble(); 489 490 cache->set(cell_name + "->Leakage->!A!B!CI", leakage_000); 491 cache->set(cell_name + "->Leakage->!A!BCI", leakage_001); 492 cache->set(cell_name + "->Leakage->!AB!CI", leakage_010); 493 cache->set(cell_name + "->Leakage->!ABCI", leakage_011); 494 cache->set(cell_name + "->Leakage->A!B!CI", leakage_100); 495 cache->set(cell_name + "->Leakage->A!BCI", leakage_101); 496 cache->set(cell_name + "->Leakage->AB!CI", leakage_110); 497 cache->set(cell_name + "->Leakage->ABCI", leakage_111); 498 Log::printLine(cell_name + "->Leakage->!A!B!CI=" + (String) leakage_000); 499 Log::printLine(cell_name + "->Leakage->!A!BCI=" + (String) leakage_001); 500 Log::printLine(cell_name + "->Leakage->!AB!CI=" + (String) leakage_010); 501 Log::printLine(cell_name + "->Leakage->!ABCI=" + (String) leakage_011); 502 Log::printLine(cell_name + "->Leakage->A!B!CI=" + (String) leakage_100); 503 Log::printLine(cell_name + "->Leakage->A!BCI=" + (String) leakage_101); 504 Log::printLine(cell_name + "->Leakage->AB!CI=" + (String) leakage_110); 505 Log::printLine(cell_name + "->Leakage->ABCI=" + (String) leakage_111); 506 // -------------------------------------------------------------------- 507 508 /* 509 // Cache event energy results 510 double event_a_flip = 0.0; 511 event_a_flip += getGenProperties()->get("INV1_A_Flip").toDouble() + getGenProperties()->get("INV1_ZN_Flip").toDouble(); 512 event_a_flip += getGenProperties()->get("INVZ1_OE_Flip").toDouble() + getGenProperties()->get("INVZ1_OEN_Flip").toDouble(); 513 event_a_flip += getGenProperties()->get("INVZ2_OE_Flip").toDouble() + getGenProperties()->get("INVZ2_OEN_Flip").toDouble(); 514 event_a_flip += getGenProperties()->get("NAND2_A1_Flip").toDouble(); 515 cache->set(cell_name + "->Event_A_Flip", event_a_flip); 516 Log::printLine(cell_name + "->Event_A_Flip=" + (String) event_a_flip); 517 518 double event_b_flip = 0.0; 519 event_b_flip += getGenProperties()->get("INV2_A_Flip").toDouble() + getGenProperties()->get("INV2_ZN_Flip").toDouble(); 520 event_b_flip += getGenProperties()->get("INVZ1_A_Flip").toDouble(); 521 event_b_flip += getGenProperties()->get("INVZ2_A_Flip").toDouble(); 522 event_b_flip += getGenProperties()->get("NAND2_A1_Flip").toDouble(); 523 cache->set(cell_name + "->Event_B_Flip", event_b_flip); 524 Log::printLine(cell_name + "->Event_B_Flip=" + (String) event_b_flip); 525 526 double event_ci_flip = 0.0; 527 event_ci_flip += getGenProperties()->get("INV3_A_Flip").toDouble() + getGenProperties()->get("INV3_ZN_Flip").toDouble(); 528 event_ci_flip += getGenProperties()->get("INVZ3_OE_Flip").toDouble() + getGenProperties()->get("INVZ3_OEN_Flip").toDouble(); 529 event_ci_flip += getGenProperties()->get("INVZ4_OE_Flip").toDouble() + getGenProperties()->get("INVZ4_OEN_Flip").toDouble(); 530 event_ci_flip += getGenProperties()->get("NAND1_A1_Flip").toDouble(); 531 cache->set(cell_name + "->Event_CI_Flip", event_ci_flip); 532 Log::printLine(cell_name + "->Event_CI_Flip=" + (String) event_ci_flip); 533 534 double event_p_flip = 0.0; 535 event_p_flip += getGenProperties()->get("INV4_A_Flip").toDouble() + getGenProperties()->get("INV4_ZN_Flip").toDouble(); 536 event_p_flip += getGenProperties()->get("INVZ1_ZN_Flip").toDouble(); 537 event_p_flip += getGenProperties()->get("INVZ2_ZN_Flip").toDouble(); 538 event_p_flip += getGenProperties()->get("NAND1_A2_Flip").toDouble(); 539 cache->set(cell_name + "->Event_P_Flip", event_p_flip); 540 Log::printLine(cell_name + "->Event_P_Flip=" + (String) event_p_flip); 541 542 double event_s_flip = 0.0; 543 event_s_flip += getGenProperties()->get("INVZ3_ZN_Flip").toDouble(); 544 event_s_flip += getGenProperties()->get("INVZ4_ZN_Flip").toDouble(); 545 cache->set(cell_name + "->Event_S_Flip", event_s_flip); 546 Log::printLine(cell_name + "->Event_S_Flip=" + (String) event_s_flip); 547 548 double event_cp_flip = 0.0; 549 event_cp_flip += getGenProperties()->get("NAND1_ZN_Flip").toDouble(); 550 event_cp_flip += getGenProperties()->get("NAND3_A2_Flip").toDouble(); 551 cache->set(cell_name + "->Event_CP_Flip", event_cp_flip); 552 Log::printLine(cell_name + "->Event_CP_Flip=" + (String) event_cp_flip); 553 554 double event_g_flip = 0.0; 555 event_g_flip += getGenProperties()->get("NAND2_ZN_Flip").toDouble(); 556 event_g_flip += getGenProperties()->get("NAND3_A2_Flip").toDouble(); 557 cache->set(cell_name + "->Event_G_Flip", event_g_flip); 558 Log::printLine(cell_name + "->Event_G_Flip=" + (String) event_g_flip); 559 560 double event_co_flip = 0.0; 561 event_co_flip += getGenProperties()->get("NAND3_ZN_Flip").toDouble(); 562 cache->set(cell_name + "->Event_CO_Flip", event_co_flip); 563 Log::printLine(cell_name + "->Event_CO_Flip=" + (String) event_co_flip); 564 */ 565 // -------------------------------------------------------------------- 566 // Get Node Capacitances 567 // -------------------------------------------------------------------- 568 double a_cap = getNet("A")->getTotalDownstreamCap(); 569 double b_cap = getNet("B")->getTotalDownstreamCap(); 570 double ci_cap = getNet("CI")->getTotalDownstreamCap(); 571 double a_b_cap = getNet("A_b")->getTotalDownstreamCap(); 572 double b_b_cap = getNet("B_b")->getTotalDownstreamCap(); 573 double ci_b_cap = getNet("CI_b")->getTotalDownstreamCap(); 574 double p_cap = getNet("P")->getTotalDownstreamCap(); 575 double p_b_cap = getNet("P_b")->getTotalDownstreamCap(); 576 double s_cap = getNet("S")->getTotalDownstreamCap(); 577 double cp_cap = getNet("CP")->getTotalDownstreamCap(); 578 double g_cap = getNet("G")->getTotalDownstreamCap(); 579 double co_cap = getNet("CO")->getTotalDownstreamCap(); 580 581 cache->set(cell_name + "->Cap->A", a_cap); 582 cache->set(cell_name + "->Cap->B", b_cap); 583 cache->set(cell_name + "->Cap->CI", ci_cap); 584 cache->set(cell_name + "->Cap->A_b", a_b_cap); 585 cache->set(cell_name + "->Cap->B_b", b_b_cap); 586 cache->set(cell_name + "->Cap->CI_b", ci_b_cap); 587 cache->set(cell_name + "->Cap->P", p_cap); 588 cache->set(cell_name + "->Cap->P_b", p_b_cap); 589 cache->set(cell_name + "->Cap->S", s_cap); 590 cache->set(cell_name + "->Cap->CP", cp_cap); 591 cache->set(cell_name + "->Cap->G", g_cap); 592 cache->set(cell_name + "->Cap->CO", co_cap); 593 594 Log::printLine(cell_name + "->Cap->A=" + (String) a_cap); 595 Log::printLine(cell_name + "->Cap->B=" + (String) b_cap); 596 Log::printLine(cell_name + "->Cap->CI=" + (String) ci_cap); 597 Log::printLine(cell_name + "->Cap->A_b=" + (String) a_b_cap); 598 Log::printLine(cell_name + "->Cap->B_b=" + (String) b_b_cap); 599 Log::printLine(cell_name + "->Cap->CI_b=" + (String) ci_b_cap); 600 Log::printLine(cell_name + "->Cap->P=" + (String) p_cap); 601 Log::printLine(cell_name + "->Cap->P_b=" + (String) p_b_cap); 602 Log::printLine(cell_name + "->Cap->S=" + (String) s_cap); 603 Log::printLine(cell_name + "->Cap->CP=" + (String) cp_cap); 604 Log::printLine(cell_name + "->Cap->G=" + (String) g_cap); 605 Log::printLine(cell_name + "->Cap->CO=" + (String) co_cap); 606 // -------------------------------------------------------------------- 607 608 // -------------------------------------------------------------------- 609 // Build Internal Delay Model 610 // -------------------------------------------------------------------- 611 // Build abstracted timing model 612 double s_ron = (getDriver("INVZ3_RonZN")->getOutputRes() + getDriver("INVZ4_RonZN")->getOutputRes()) / 2; 613 double co_ron = getDriver("NAND3_RonZN")->getOutputRes(); 614 615 double a_to_s_delay = 0.0; 616 a_to_s_delay += getDriver("INV1_RonZN")->calculateDelay(); 617 a_to_s_delay += max(getDriver("INVZ1_RonZN")->calculateDelay(), getDriver("INVZ2_RonZN")->calculateDelay()); 618 a_to_s_delay += max(getDriver("INVZ3_RonZN")->calculateDelay(), getDriver("INV4_RonZN")->calculateDelay() + getDriver("INVZ4_RonZN")->calculateDelay()); 619 620 double b_to_s_delay = 0.0; 621 b_to_s_delay += max(getDriver("INVZ1_RonZN")->calculateDelay(), getDriver("INV2_RonZN")->calculateDelay() + getDriver("INVZ2_RonZN")->calculateDelay()); 622 b_to_s_delay += max(getDriver("INVZ3_RonZN")->calculateDelay(), getDriver("INV4_RonZN")->calculateDelay() + getDriver("INVZ4_RonZN")->calculateDelay()); 623 624 double ci_to_s_delay = 0.0; 625 ci_to_s_delay += getDriver("INV3_RonZN")->calculateDelay(); 626 ci_to_s_delay += max(getDriver("INVZ3_RonZN")->calculateDelay(), getDriver("INVZ4_RonZN")->calculateDelay()); 627 628 double a_to_co_delay = 0.0; 629 a_to_co_delay += max(getDriver("NAND2_RonZN")->calculateDelay(), //Generate path 630 getDriver("INV1_RonZN")->calculateDelay() + //Carry propagate path 631 max(getDriver("INVZ1_RonZN")->calculateDelay(), getDriver("INVZ2_RonZN")->calculateDelay()) + 632 getDriver("NAND1_RonZN")->calculateDelay()); 633 a_to_co_delay += getDriver("NAND3_RonZN")->calculateDelay(); 634 635 double b_to_co_delay = 0.0; 636 b_to_co_delay += max(getDriver("NAND2_RonZN")->calculateDelay(), //Generate path 637 max(getDriver("INVZ1_RonZN")->calculateDelay(), //Carry propagate path 638 getDriver("INV2_RonZN")->calculateDelay() + getDriver("INVZ2_RonZN")->calculateDelay()) + 639 getDriver("NAND1_RonZN")->calculateDelay()); 640 b_to_co_delay += getDriver("NAND3_RonZN")->calculateDelay(); 641 642 double ci_to_co_delay = 0.0; 643 ci_to_co_delay += getDriver("NAND1_RonZN")->calculateDelay(); 644 ci_to_co_delay += getDriver("NAND3_RonZN")->calculateDelay(); 645 646 cache->set(cell_name + "->DriveRes->S", s_ron); 647 cache->set(cell_name + "->DriveRes->CO", co_ron); 648 649 cache->set(cell_name + "->Delay->A_to_S", a_to_s_delay); 650 cache->set(cell_name + "->Delay->B_to_S", b_to_s_delay); 651 cache->set(cell_name + "->Delay->CI_to_S", ci_to_s_delay); 652 cache->set(cell_name + "->Delay->A_to_CO", a_to_co_delay); 653 cache->set(cell_name + "->Delay->B_to_CO", b_to_co_delay); 654 cache->set(cell_name + "->Delay->CI_to_CO", ci_to_co_delay); 655 656 Log::printLine(cell_name + "->DriveRes->S=" + (String) s_ron); 657 Log::printLine(cell_name + "->DriveRes->CO=" + (String) co_ron); 658 Log::printLine(cell_name + "->Delay->A_to_S=" + (String) a_to_s_delay); 659 Log::printLine(cell_name + "->Delay->B_to_S=" + (String) b_to_s_delay); 660 Log::printLine(cell_name + "->Delay->CI_to_S=" + (String) ci_to_s_delay); 661 Log::printLine(cell_name + "->Delay->A_to_CO=" + (String) a_to_co_delay); 662 Log::printLine(cell_name + "->Delay->B_to_CO=" + (String) b_to_co_delay); 663 Log::printLine(cell_name + "->Delay->CI_to_CO=" + (String) ci_to_co_delay); 664 // -------------------------------------------------------------------- 665 666 return; 667 668 } 669 670} // namespace DSENT 671 672