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