StdCellLib.cc revision 10447:a465576671d4
110037SARM gem5 Developers#include "model/std_cells/StdCellLib.h" 210037SARM gem5 Developers 313120SEdmund.Grimley-Evans@arm.com#include <cmath> 410037SARM gem5 Developers 510037SARM gem5 Developers#include "model/std_cells/StdCell.h" 610037SARM gem5 Developers#include "model/std_cells/INV.h" 710037SARM gem5 Developers#include "model/ModelGen.h" 810037SARM gem5 Developers 910037SARM gem5 Developersnamespace DSENT 1010037SARM gem5 Developers{ 1110037SARM gem5 Developers using std::pow; 1210037SARM gem5 Developers 1310037SARM gem5 Developers StdCellLib::StdCellLib(TechModel* tech_model_) 1410037SARM gem5 Developers : m_tech_model_(tech_model_) 1510037SARM gem5 Developers { 1610037SARM gem5 Developers m_std_cell_cache_ = new Map<double>(); 1710037SARM gem5 Developers ASSERT((m_tech_model_ != NULL), "[Error] StdCellLib -> tech_model is NULL"); 1810037SARM gem5 Developers createLib(); 1910037SARM gem5 Developers } 2010037SARM gem5 Developers 2110037SARM gem5 Developers StdCellLib::~StdCellLib() 2210037SARM gem5 Developers { 2310037SARM gem5 Developers delete m_std_cell_cache_; 2410037SARM gem5 Developers } 2510037SARM gem5 Developers 2610037SARM gem5 Developers const TechModel* StdCellLib::getTechModel() const 2710037SARM gem5 Developers { 2810037SARM gem5 Developers return m_tech_model_; 2910037SARM gem5 Developers } 3010037SARM gem5 Developers 3110037SARM gem5 Developers StdCell* StdCellLib::createStdCell(const String& std_cell_name_, const String& instance_name_) const 3210037SARM gem5 Developers { 3310037SARM gem5 Developers // Create the standard cell 3410037SARM gem5 Developers StdCell* created_cell = ModelGen::createStdCell(std_cell_name_, instance_name_, getTechModel()); 3510037SARM gem5 Developers // Grab the variants of each standard cell 3610037SARM gem5 Developers String driving_strength_str = getTechModel()->get("StdCell->AvailableSizes"); 3710037SARM gem5 Developers // Set library properties for the standard cell 3810037SARM gem5 Developers created_cell->setPToNRatio(getPToNRatio()); 3910037SARM gem5 Developers created_cell->setActiveHeight(getActiveHeight()); 4010037SARM gem5 Developers created_cell->setTotalHeight(getTotalHeight()); 4110037SARM gem5 Developers created_cell->setAvailableDrivingStrengths(driving_strength_str); 4210037SARM gem5 Developers return created_cell; 4310037SARM gem5 Developers } 4410037SARM gem5 Developers 4511165SRekai.GonzalezAlberquilla@arm.com // Get PMOS to NMOS ratio 4610037SARM gem5 Developers double StdCellLib::getPToNRatio() const 4710037SARM gem5 Developers { 4813120SEdmund.Grimley-Evans@arm.com return m_p_to_n_ratio_; 4910037SARM gem5 Developers } 5010037SARM gem5 Developers 5113759Sgiacomo.gabrielli@arm.com void StdCellLib::setPToNRatio(double p_to_n_ratio_) 5213759Sgiacomo.gabrielli@arm.com { 5313759Sgiacomo.gabrielli@arm.com m_p_to_n_ratio_ = p_to_n_ratio_; 5413759Sgiacomo.gabrielli@arm.com } 5513759Sgiacomo.gabrielli@arm.com 5610037SARM gem5 Developers // Get height of the standard cell taken by active transistors 5710037SARM gem5 Developers double StdCellLib::getActiveHeight() const 5811165SRekai.GonzalezAlberquilla@arm.com { 5910037SARM gem5 Developers return m_active_height_; 6011165SRekai.GonzalezAlberquilla@arm.com } 6110037SARM gem5 Developers 6210037SARM gem5 Developers void StdCellLib::setActiveHeight(double active_height_) 6310037SARM gem5 Developers { 6410037SARM gem5 Developers m_active_height_ = active_height_; 6510037SARM gem5 Developers } 6610037SARM gem5 Developers 6710037SARM gem5 Developers // Get total height of the standard cell including overheads 6810037SARM gem5 Developers double StdCellLib::getTotalHeight() const 6910037SARM gem5 Developers { 7010037SARM gem5 Developers return m_total_height_; 7110037SARM gem5 Developers } 7210037SARM gem5 Developers 7310037SARM gem5 Developers void StdCellLib::setTotalHeight(double total_height_) 7410037SARM gem5 Developers { 7510037SARM gem5 Developers m_total_height_ = total_height_; 7610037SARM gem5 Developers } 7710037SARM gem5 Developers 7810037SARM gem5 Developers void StdCellLib::createLib() 7910037SARM gem5 Developers { 8010037SARM gem5 Developers Log::printLine("Standard cell library creation for tech model " + getTechModel()->get("Name")); 8110037SARM gem5 Developers 8210037SARM gem5 Developers // Get technology parameters 8310037SARM gem5 Developers double nmos_eff_res = getTechModel()->get("Nmos->EffResWidth"); 8410037SARM gem5 Developers double pmos_eff_res = getTechModel()->get("Pmos->EffResWidth"); 8510037SARM gem5 Developers double gate_min_width = getTechModel()->get("Gate->MinWidth"); 8610037SARM gem5 Developers 8710037SARM gem5 Developers // Create standard cell common parameters 8810037SARM gem5 Developers double pn_ratio = pmos_eff_res / nmos_eff_res; 8910037SARM gem5 Developers double nmos_unit_width = gate_min_width; 9010037SARM gem5 Developers double pmos_unit_width = gate_min_width * pn_ratio; 9110037SARM gem5 Developers 9210037SARM gem5 Developers // Derive the height of each cell in the standard cell library, as well as the max Nmos and Pmos widths 9310037SARM gem5 Developers double std_cell_total_height = getTechModel()->get("StdCell->Tracks").toDouble() * 9410037SARM gem5 Developers (getTechModel()->get("Wire->Metal1->MinWidth").toDouble() + getTechModel()->get("Wire->Metal1->MinSpacing").toDouble()); 9510037SARM gem5 Developers double std_cell_active_height = std_cell_total_height / getTechModel()->get("StdCell->HeightOverheadFactor").toDouble(); 9610037SARM gem5 Developers 9710037SARM gem5 Developers Log::printLine("Standard cell P-to-N ratio (Beta) = " + (String) pn_ratio); 9810037SARM gem5 Developers Log::printLine("Standard cell NMOS unit width = " + (String) nmos_unit_width); 9910037SARM gem5 Developers Log::printLine("Standard cell PMOS unit width = " + (String) pmos_unit_width); 10010037SARM gem5 Developers Log::printLine("Standard cell active height = " + (String) std_cell_active_height); 10110037SARM gem5 Developers Log::printLine("Standard cell total height = " + (String) std_cell_total_height); 10210037SARM gem5 Developers 10310037SARM gem5 Developers setPToNRatio(pn_ratio); 10410037SARM gem5 Developers setActiveHeight(std_cell_active_height); 10510037SARM gem5 Developers setTotalHeight(std_cell_total_height); 10610037SARM gem5 Developers 10710037SARM gem5 Developers const vector<String>& cell_sizes = getTechModel()->get("StdCell->AvailableSizes").split("[,]"); 10810037SARM gem5 Developers // Create cached standard cells 10910037SARM gem5 Developers for (unsigned int i = 0; i < cell_sizes.size(); ++i) 11010037SARM gem5 Developers { 11110037SARM gem5 Developers StdCell* inv = createStdCell("INV", "CachedINV"); 11210037SARM gem5 Developers inv->cacheStdCell(this, cell_sizes[i].toDouble()); 11310037SARM gem5 Developers delete inv; 11410037SARM gem5 Developers 11510037SARM gem5 Developers StdCell* nand2 = createStdCell("NAND2", "CachedNAND2"); 11610037SARM gem5 Developers nand2->cacheStdCell(this, cell_sizes[i].toDouble()); 11710037SARM gem5 Developers delete nand2; 11810037SARM gem5 Developers 11910037SARM gem5 Developers StdCell* nor2 = createStdCell("NOR2", "CachedNOR2"); 12010037SARM gem5 Developers nor2->cacheStdCell(this, cell_sizes[i].toDouble()); 12110037SARM gem5 Developers delete nor2; 12210037SARM gem5 Developers 12310037SARM gem5 Developers StdCell* mux2 = createStdCell("MUX2", "CachedMUX2"); 12410037SARM gem5 Developers mux2->cacheStdCell(this, cell_sizes[i].toDouble()); 12510037SARM gem5 Developers delete mux2; 12610037SARM gem5 Developers 12710037SARM gem5 Developers StdCell* xor2 = createStdCell("XOR2", "CachedXOR2"); 12810037SARM gem5 Developers xor2->cacheStdCell(this, cell_sizes[i].toDouble()); 12910037SARM gem5 Developers delete xor2; 13010037SARM gem5 Developers 13110037SARM gem5 Developers StdCell* addf = createStdCell("ADDF", "CachedADDF"); 13210037SARM gem5 Developers addf->cacheStdCell(this, cell_sizes[i].toDouble()); 13310037SARM gem5 Developers delete addf; 13410037SARM gem5 Developers 13510037SARM gem5 Developers StdCell* dffq = createStdCell("DFFQ", "CachedDFFQ"); 13610037SARM gem5 Developers dffq->cacheStdCell(this, cell_sizes[i].toDouble()); 13710037SARM gem5 Developers delete dffq; 13810037SARM gem5 Developers 13910037SARM gem5 Developers StdCell* latq = createStdCell("LATQ", "CachedLATQ"); 14013759Sgiacomo.gabrielli@arm.com latq->cacheStdCell(this, cell_sizes[i].toDouble()); 14110037SARM gem5 Developers delete latq; 14210037SARM gem5 Developers 14310037SARM gem5 Developers StdCell* or2 = createStdCell("OR2", "CachedOR2"); 14410037SARM gem5 Developers or2->cacheStdCell(this, cell_sizes[i].toDouble()); 14510037SARM gem5 Developers delete or2; 14610037SARM gem5 Developers 14710037SARM gem5 Developers StdCell* and2 = createStdCell("AND2", "CachedAND2"); 14810037SARM gem5 Developers and2->cacheStdCell(this, cell_sizes[i].toDouble()); 14910037SARM gem5 Developers delete and2; 15010037SARM gem5 Developers } 15110037SARM gem5 Developers 15210037SARM gem5 Developers Log::printLine("Standard cell library creation - End"); 15310037SARM gem5 Developers return; 15410037SARM gem5 Developers } 15510037SARM gem5 Developers 15610037SARM gem5 Developers StdCellLib* StdCellLib::clone() const 15710037SARM gem5 Developers { 15810037SARM gem5 Developers StdCellLib* new_lib = new StdCellLib(m_tech_model_); 15910037SARM gem5 Developers return new_lib; 16010037SARM gem5 Developers } 16110037SARM gem5 Developers 16210037SARM gem5 Developers const String StdCellLib::genDrivingStrengthString(const vector<double>& driving_strength_) const 16310037SARM gem5 Developers { 16410037SARM gem5 Developers String ret_str = "["; 16510037SARM gem5 Developers for(int i = 0; i < (int)driving_strength_.size() - 1; ++i) 16610037SARM gem5 Developers { 16710037SARM gem5 Developers ret_str += String(driving_strength_[i]) + ", "; 16810037SARM gem5 Developers } 16910037SARM gem5 Developers ret_str += String(driving_strength_[driving_strength_.size() - 1]); 17010037SARM gem5 Developers ret_str += "]"; 17110037SARM gem5 Developers return ret_str; 17210037SARM gem5 Developers } 17310037SARM gem5 Developers 17410037SARM gem5 Developers Map<double>* StdCellLib::getStdCellCache() const 17510037SARM gem5 Developers { 17610037SARM gem5 Developers return m_std_cell_cache_; 17710037SARM gem5 Developers } 17810037SARM gem5 Developers 17910037SARM gem5 Developers} // namespace DSENT 18010037SARM gem5 Developers 18110037SARM gem5 Developers