DSENT.cc revision 10447
110447Snilay@cs.wisc.edu#include "DSENT.h"
210447Snilay@cs.wisc.edu
310447Snilay@cs.wisc.edu#include <cstdlib>
410447Snilay@cs.wisc.edu#include <iostream>
510447Snilay@cs.wisc.edu
610447Snilay@cs.wisc.edunamespace DSENT
710447Snilay@cs.wisc.edu{
810447Snilay@cs.wisc.edu    Model* DSENT::ms_model_ = NULL;
910447Snilay@cs.wisc.edu    bool DSENT::ms_is_verbose_ = false;
1010447Snilay@cs.wisc.edu
1110447Snilay@cs.wisc.edu    void DSENT::run(int argc_, char** argv_)
1210447Snilay@cs.wisc.edu    {
1310447Snilay@cs.wisc.edu        // Initialize DSENT framework (setup log file, config file, ...)
1410447Snilay@cs.wisc.edu        initialize(argc_, argv_);
1510447Snilay@cs.wisc.edu
1610447Snilay@cs.wisc.edu        // Build the specified model in the config file
1710447Snilay@cs.wisc.edu        buildModel();
1810447Snilay@cs.wisc.edu
1910447Snilay@cs.wisc.edu        // Process the specified queries
2010447Snilay@cs.wisc.edu        processQuery();
2110447Snilay@cs.wisc.edu        // Process the specified evaluation
2210447Snilay@cs.wisc.edu        processEvaluate();
2310447Snilay@cs.wisc.edu
2410447Snilay@cs.wisc.edu        // Finalize DSENT framework (close log file, ...)
2510447Snilay@cs.wisc.edu        finalize();
2610447Snilay@cs.wisc.edu        return;
2710447Snilay@cs.wisc.edu    }
2810447Snilay@cs.wisc.edu
2910447Snilay@cs.wisc.edu    void DSENT::setRuntimeOptions(OptionParser* option_parser_)
3010447Snilay@cs.wisc.edu    {
3110447Snilay@cs.wisc.edu        option_parser_->addOption("-cfg", "ConfigFilename", true, "filename", false, "",
3210447Snilay@cs.wisc.edu                "Specify the config filename.");
3310447Snilay@cs.wisc.edu
3410447Snilay@cs.wisc.edu        option_parser_->addOption("-available_models", "IsListModels", false, "", true, "false",
3510447Snilay@cs.wisc.edu                "List available DSENT models.");
3610447Snilay@cs.wisc.edu
3710447Snilay@cs.wisc.edu        option_parser_->addOption("-log", "LogFilename", true, "filename", true, "./dsent.log",
3810447Snilay@cs.wisc.edu                "Specify the log filename.");
3910447Snilay@cs.wisc.edu
4010447Snilay@cs.wisc.edu        option_parser_->addOption("-overwrite", "OverwriteString", true, "options", true, "",
4110447Snilay@cs.wisc.edu                "Overwrite dynamically the options set in the config file. Options are separated by a comma (;).");
4210447Snilay@cs.wisc.edu
4310447Snilay@cs.wisc.edu        option_parser_->addOption("-overwrite_tech", "OverwriteTechString", true, "options", true, "",
4410447Snilay@cs.wisc.edu                "Overwrite dynamically the options set in the technology file. Options are separated by a comma (;).");
4510447Snilay@cs.wisc.edu
4610447Snilay@cs.wisc.edu        option_parser_->addOption("-print_config", "IsPrintConfig", false, "", true, "false",
4710447Snilay@cs.wisc.edu                "Print the config used at DSENT runtime.");
4810447Snilay@cs.wisc.edu
4910447Snilay@cs.wisc.edu        option_parser_->addOption("-query", "QueryString", true, "query string", true, "",
5010447Snilay@cs.wisc.edu                "Specify the list of items to query. This command is the same as owerwriting the 'QueryString'.");
5110447Snilay@cs.wisc.edu
5210447Snilay@cs.wisc.edu        option_parser_->addOption("-eval", "EvaluateString", true, "evaluate string", true, "",
5310447Snilay@cs.wisc.edu                "Specify the list of statements to evaluate. This command is the same as owerwriting the 'EvaluateString'.");
5410447Snilay@cs.wisc.edu
5510447Snilay@cs.wisc.edu        option_parser_->addOption("-verbose", "IsVerbose", false, "", true, "false",
5610447Snilay@cs.wisc.edu                "Enable verbose mode which prints out more detailed messages.");
5710447Snilay@cs.wisc.edu        return;
5810447Snilay@cs.wisc.edu    }
5910447Snilay@cs.wisc.edu
6010447Snilay@cs.wisc.edu    void DSENT::initialize(int argc_, char** argv_)
6110447Snilay@cs.wisc.edu    {
6210447Snilay@cs.wisc.edu        OptionParser* option_parser = new OptionParser();
6310447Snilay@cs.wisc.edu
6410447Snilay@cs.wisc.edu        // Init the option parser and setup available options
6510447Snilay@cs.wisc.edu        setRuntimeOptions(option_parser);
6610447Snilay@cs.wisc.edu
6710447Snilay@cs.wisc.edu        // Parse the options
6810447Snilay@cs.wisc.edu        option_parser->parseArguments(argc_, argv_);
6910447Snilay@cs.wisc.edu
7010447Snilay@cs.wisc.edu        // If -available_models is specified, print out a list of available
7110447Snilay@cs.wisc.edu        // models and exit DSENT.
7210447Snilay@cs.wisc.edu        if(option_parser->get("IsListModels").toBool())
7310447Snilay@cs.wisc.edu        {
7410447Snilay@cs.wisc.edu            ModelGen::printAvailableModels();
7510447Snilay@cs.wisc.edu            exit(0);
7610447Snilay@cs.wisc.edu        }
7710447Snilay@cs.wisc.edu
7810447Snilay@cs.wisc.edu        // Init the log file
7910447Snilay@cs.wisc.edu        Log::allocate(option_parser->get("LogFilename"));
8010447Snilay@cs.wisc.edu
8110447Snilay@cs.wisc.edu        // Init the config file
8210447Snilay@cs.wisc.edu        Config::allocate(option_parser->get("ConfigFilename"));
8310447Snilay@cs.wisc.edu        Config* dsent_config = Config::getSingleton();
8410447Snilay@cs.wisc.edu
8510447Snilay@cs.wisc.edu        // Overwrite the existing options
8610447Snilay@cs.wisc.edu        dsent_config->readString(option_parser->get("OverwriteString"));
8710447Snilay@cs.wisc.edu
8810447Snilay@cs.wisc.edu        // Overwrite the technology file
8910447Snilay@cs.wisc.edu        dsent_config->constructTechModel(option_parser->get("OverwriteTechString"));
9010447Snilay@cs.wisc.edu
9110447Snilay@cs.wisc.edu        ms_is_verbose_ = option_parser->get("IsVerbose").toBool();
9210447Snilay@cs.wisc.edu
9310447Snilay@cs.wisc.edu        // Overwrite the query string if it is specified from command line
9410447Snilay@cs.wisc.edu        if(option_parser->get("QueryString").size() != 0)
9510447Snilay@cs.wisc.edu        {
9610447Snilay@cs.wisc.edu            dsent_config->set("QueryString", option_parser->get("QueryString"));
9710447Snilay@cs.wisc.edu        }
9810447Snilay@cs.wisc.edu        // Overwrite the evaluation string if it is specified from command line
9910447Snilay@cs.wisc.edu        if(option_parser->get("EvaluateString").size() != 0)
10010447Snilay@cs.wisc.edu        {
10110447Snilay@cs.wisc.edu            dsent_config->set("EvaluateString", option_parser->get("EvaluateString"));
10210447Snilay@cs.wisc.edu        }
10310447Snilay@cs.wisc.edu
10410447Snilay@cs.wisc.edu        // Print the config used for this run
10510447Snilay@cs.wisc.edu        if(option_parser->get("IsPrintConfig").toBool())
10610447Snilay@cs.wisc.edu        {
10710447Snilay@cs.wisc.edu            if(ms_is_verbose_)
10810447Snilay@cs.wisc.edu            {
10910447Snilay@cs.wisc.edu                cout << "Configuration:" << endl;
11010447Snilay@cs.wisc.edu                cout << "==============" << endl;
11110447Snilay@cs.wisc.edu            }
11210447Snilay@cs.wisc.edu            cout << *dsent_config;
11310447Snilay@cs.wisc.edu
11410447Snilay@cs.wisc.edu            if(ms_is_verbose_)
11510447Snilay@cs.wisc.edu            {
11610447Snilay@cs.wisc.edu                cout << "==============" << endl;
11710447Snilay@cs.wisc.edu            }
11810447Snilay@cs.wisc.edu        }
11910447Snilay@cs.wisc.edu
12010447Snilay@cs.wisc.edu        delete option_parser;
12110447Snilay@cs.wisc.edu        return;
12210447Snilay@cs.wisc.edu    }
12310447Snilay@cs.wisc.edu
12410447Snilay@cs.wisc.edu    void DSENT::buildModel()
12510447Snilay@cs.wisc.edu    {
12610447Snilay@cs.wisc.edu        Config* dsent_config = Config::getSingleton();
12710447Snilay@cs.wisc.edu
12810447Snilay@cs.wisc.edu        // Create the model specified
12910447Snilay@cs.wisc.edu        const String& model_name = dsent_config->get("ModelName");
13010447Snilay@cs.wisc.edu        ms_model_ = ModelGen::createModel(model_name, model_name, dsent_config->getTechModel());
13110447Snilay@cs.wisc.edu
13210447Snilay@cs.wisc.edu        // Construct the model
13310447Snilay@cs.wisc.edu        // Read all parameters the model requires
13410447Snilay@cs.wisc.edu        const vector<String>* parameter_names = ms_model_->getParameterNames();
13510447Snilay@cs.wisc.edu        // For all parameters, grab values from the config file
13610447Snilay@cs.wisc.edu        for(vector<String>::const_iterator it = parameter_names->begin(); it != parameter_names->end(); ++it)
13710447Snilay@cs.wisc.edu        {
13810447Snilay@cs.wisc.edu            const String& parameter_name = *it;
13910447Snilay@cs.wisc.edu            // If it exists in the config file, set the parameter
14010447Snilay@cs.wisc.edu            if(dsent_config->keyExist(parameter_name))
14110447Snilay@cs.wisc.edu            {
14210447Snilay@cs.wisc.edu                ms_model_->setParameter(parameter_name, dsent_config->get(parameter_name));
14310447Snilay@cs.wisc.edu            }
14410447Snilay@cs.wisc.edu        }
14510447Snilay@cs.wisc.edu        ms_model_->construct();
14610447Snilay@cs.wisc.edu
14710447Snilay@cs.wisc.edu        // Update the model
14810447Snilay@cs.wisc.edu        // Read all properties the model requires
14910447Snilay@cs.wisc.edu        const vector<String>* property_names = ms_model_->getPropertyNames();
15010447Snilay@cs.wisc.edu        // For all properties, grab values from the config file
15110447Snilay@cs.wisc.edu        for(vector<String>::const_iterator it = property_names->begin(); it != property_names->end(); ++it)
15210447Snilay@cs.wisc.edu        {
15310447Snilay@cs.wisc.edu            const String& property_name = *it;
15410447Snilay@cs.wisc.edu            // If it exists in the config file, set the parameter
15510447Snilay@cs.wisc.edu            if(dsent_config->keyExist(property_name))
15610447Snilay@cs.wisc.edu            {
15710447Snilay@cs.wisc.edu                ms_model_->setProperty(property_name, dsent_config->get(property_name));
15810447Snilay@cs.wisc.edu            }
15910447Snilay@cs.wisc.edu        }
16010447Snilay@cs.wisc.edu        ms_model_->update();
16110447Snilay@cs.wisc.edu
16210447Snilay@cs.wisc.edu        // Evaluate the model
16310447Snilay@cs.wisc.edu        // Perform timing optimization if needed
16410447Snilay@cs.wisc.edu        if(dsent_config->getIfKeyExist("IsPerformTimingOptimization", "false").toBool())
16510447Snilay@cs.wisc.edu        {
16610447Snilay@cs.wisc.edu            performTimingOpt();
16710447Snilay@cs.wisc.edu        }
16810447Snilay@cs.wisc.edu        ms_model_->evaluate();
16910447Snilay@cs.wisc.edu
17010447Snilay@cs.wisc.edu        // Report timing if needed
17110447Snilay@cs.wisc.edu        if(dsent_config->getIfKeyExist("IsReportTiming", "false").toBool())
17210447Snilay@cs.wisc.edu        {
17310447Snilay@cs.wisc.edu            reportTiming();
17410447Snilay@cs.wisc.edu        }
17510447Snilay@cs.wisc.edu
17610447Snilay@cs.wisc.edu        return;
17710447Snilay@cs.wisc.edu    }
17810447Snilay@cs.wisc.edu
17910447Snilay@cs.wisc.edu    void DSENT::processQuery()
18010447Snilay@cs.wisc.edu    {
18110447Snilay@cs.wisc.edu        Config* dsent_config = Config::getSingleton();
18210447Snilay@cs.wisc.edu        vector<String> queries = dsent_config->get("QueryString").split(" ;\r\n");
18310447Snilay@cs.wisc.edu
18410447Snilay@cs.wisc.edu        if(ms_is_verbose_)
18510447Snilay@cs.wisc.edu        {
18610447Snilay@cs.wisc.edu            cout << "Query results:" << endl;
18710447Snilay@cs.wisc.edu            cout << "==============" << endl;
18810447Snilay@cs.wisc.edu        }
18910447Snilay@cs.wisc.edu
19010447Snilay@cs.wisc.edu        for(unsigned int i = 0; i < queries.size(); ++i)
19110447Snilay@cs.wisc.edu        {
19210447Snilay@cs.wisc.edu            const String& curr_query = queries[i];
19310447Snilay@cs.wisc.edu
19410447Snilay@cs.wisc.edu            if(ms_is_verbose_)
19510447Snilay@cs.wisc.edu            {
19610447Snilay@cs.wisc.edu                String str = "Process query: '" + curr_query + "'";
19710447Snilay@cs.wisc.edu                cout << str << endl;
19810447Snilay@cs.wisc.edu                cout << String(str.size(), '-') << endl;
19910447Snilay@cs.wisc.edu            }
20010447Snilay@cs.wisc.edu
20110447Snilay@cs.wisc.edu            processQuery(curr_query, true);
20210447Snilay@cs.wisc.edu
20310447Snilay@cs.wisc.edu            if(ms_is_verbose_)
20410447Snilay@cs.wisc.edu            {
20510447Snilay@cs.wisc.edu                cout << endl;
20610447Snilay@cs.wisc.edu            }
20710447Snilay@cs.wisc.edu        }
20810447Snilay@cs.wisc.edu        if(ms_is_verbose_)
20910447Snilay@cs.wisc.edu        {
21010447Snilay@cs.wisc.edu            cout << "==============" << endl;
21110447Snilay@cs.wisc.edu        }
21210447Snilay@cs.wisc.edu        return;
21310447Snilay@cs.wisc.edu    }
21410447Snilay@cs.wisc.edu
21510447Snilay@cs.wisc.edu    const void* DSENT::processQuery(const String& query_str_, bool is_print_)
21610447Snilay@cs.wisc.edu    {
21710447Snilay@cs.wisc.edu        vector<String> type_split = query_str_.splitByString(Model::TYPE_SEPARATOR);
21810447Snilay@cs.wisc.edu        ASSERT((type_split.size() == 2), "[Error] Invalid query format: " + query_str_);
21910447Snilay@cs.wisc.edu        String query_type = type_split[0];
22010447Snilay@cs.wisc.edu
22110447Snilay@cs.wisc.edu        vector<String> detail_split = type_split[1].splitByString(Model::DETAIL_SEPARATOR);
22210447Snilay@cs.wisc.edu        ASSERT((detail_split.size() == 2), "[Error] Invalid query format: " + query_str_);
22310447Snilay@cs.wisc.edu        String query_detail = detail_split[1];
22410447Snilay@cs.wisc.edu
22510447Snilay@cs.wisc.edu        vector<String> subfield_split = detail_split[0].splitByString(Model::SUBFIELD_SEPARATOR);
22610447Snilay@cs.wisc.edu        ASSERT(((subfield_split.size() == 2) || (subfield_split.size() == 1)), "[Error] Invalid query format: " + query_str_);
22710447Snilay@cs.wisc.edu        String query_hier = subfield_split[0];
22810447Snilay@cs.wisc.edu        String query_subfield = "";
22910447Snilay@cs.wisc.edu        if(subfield_split.size() == 2)
23010447Snilay@cs.wisc.edu        {
23110447Snilay@cs.wisc.edu            query_subfield = subfield_split[1];
23210447Snilay@cs.wisc.edu        }
23310447Snilay@cs.wisc.edu
23410447Snilay@cs.wisc.edu        const void* query_result = ms_model_->parseQuery(query_type, query_hier, query_subfield);
23510447Snilay@cs.wisc.edu        if(query_type == "Property")
23610447Snilay@cs.wisc.edu        {
23710447Snilay@cs.wisc.edu            const PropertyMap* property = (const PropertyMap*)query_result;
23810447Snilay@cs.wisc.edu            if(is_print_)
23910447Snilay@cs.wisc.edu            {
24010447Snilay@cs.wisc.edu                cout << *property;
24110447Snilay@cs.wisc.edu            }
24210447Snilay@cs.wisc.edu        }
24310447Snilay@cs.wisc.edu        else if(query_type == "Parameter")
24410447Snilay@cs.wisc.edu        {
24510447Snilay@cs.wisc.edu            const ParameterMap* parameter = (const ParameterMap*)query_result;
24610447Snilay@cs.wisc.edu            if(is_print_)
24710447Snilay@cs.wisc.edu            {
24810447Snilay@cs.wisc.edu                cout << *parameter;
24910447Snilay@cs.wisc.edu            }
25010447Snilay@cs.wisc.edu        }
25110447Snilay@cs.wisc.edu        else if(query_type.contain("Hier"))
25210447Snilay@cs.wisc.edu        {
25310447Snilay@cs.wisc.edu            const Model* model = (const Model*)query_result;
25410447Snilay@cs.wisc.edu            if(is_print_)
25510447Snilay@cs.wisc.edu            {
25610447Snilay@cs.wisc.edu                model->printHierarchy(query_type, query_subfield, "", query_detail, cout);
25710447Snilay@cs.wisc.edu            }
25810447Snilay@cs.wisc.edu        }
25910447Snilay@cs.wisc.edu        else
26010447Snilay@cs.wisc.edu        {
26110447Snilay@cs.wisc.edu            const Result* result = (const Result*)query_result;
26210447Snilay@cs.wisc.edu            if(is_print_)
26310447Snilay@cs.wisc.edu            {
26410447Snilay@cs.wisc.edu                result->print(query_type + Model::TYPE_SEPARATOR + query_hier +
26510447Snilay@cs.wisc.edu                        Model::SUBFIELD_SEPARATOR + query_subfield, query_detail, cout);
26610447Snilay@cs.wisc.edu            }
26710447Snilay@cs.wisc.edu        }
26810447Snilay@cs.wisc.edu        return query_result;
26910447Snilay@cs.wisc.edu    }
27010447Snilay@cs.wisc.edu
27110447Snilay@cs.wisc.edu    void DSENT::finalize()
27210447Snilay@cs.wisc.edu    {
27310447Snilay@cs.wisc.edu        // Release the constructed model
27410447Snilay@cs.wisc.edu        delete ms_model_;
27510447Snilay@cs.wisc.edu        ms_model_ = NULL;
27610447Snilay@cs.wisc.edu
27710447Snilay@cs.wisc.edu        // Release the config file
27810447Snilay@cs.wisc.edu        Config::release();
27910447Snilay@cs.wisc.edu
28010447Snilay@cs.wisc.edu        // Release the log file
28110447Snilay@cs.wisc.edu        Log::release();
28210447Snilay@cs.wisc.edu
28310447Snilay@cs.wisc.edu        return;
28410447Snilay@cs.wisc.edu    }
28510447Snilay@cs.wisc.edu
28610447Snilay@cs.wisc.edu    void DSENT::performTimingOpt()
28710447Snilay@cs.wisc.edu    {
28810447Snilay@cs.wisc.edu        Config* dsent_config = Config::getSingleton();
28910447Snilay@cs.wisc.edu
29010447Snilay@cs.wisc.edu        // Get the frequency it is optimizing to
29110447Snilay@cs.wisc.edu        double freq = dsent_config->get("Frequency").toDouble();
29210447Snilay@cs.wisc.edu
29310447Snilay@cs.wisc.edu        // Get all the starting net names
29410447Snilay@cs.wisc.edu        const vector<String>& start_net_names = dsent_config->get("TimingOptimization->StartNetNames").split("[,]");
29510447Snilay@cs.wisc.edu
29610447Snilay@cs.wisc.edu        ASSERT((start_net_names.size() > 0), "[Error] Expecting net names in TimingOptimization->StartNetNames");
29710447Snilay@cs.wisc.edu
29810447Snilay@cs.wisc.edu        if(start_net_names[0] == "*")
29910447Snilay@cs.wisc.edu        {
30010447Snilay@cs.wisc.edu            // Optimize from all input ports
30110447Snilay@cs.wisc.edu            ElectricalModel* electrical_model = (ElectricalModel*)ms_model_;
30210447Snilay@cs.wisc.edu
30310447Snilay@cs.wisc.edu            ElectricalTimingOptimizer timing_optimizer("Optimizer", electrical_model->getTechModel());
30410447Snilay@cs.wisc.edu            timing_optimizer.setModel(electrical_model);
30510447Snilay@cs.wisc.edu            timing_optimizer.construct();
30610447Snilay@cs.wisc.edu            timing_optimizer.update();
30710447Snilay@cs.wisc.edu
30810447Snilay@cs.wisc.edu            ElectricalTimingTree timing_tree(timing_optimizer.getInstanceName(), &timing_optimizer);
30910447Snilay@cs.wisc.edu
31010447Snilay@cs.wisc.edu            const Map<PortInfo*>* input_ports = timing_optimizer.getInputs();
31110447Snilay@cs.wisc.edu            Map<PortInfo*>::ConstIterator it_begin = input_ports->begin();
31210447Snilay@cs.wisc.edu            Map<PortInfo*>::ConstIterator it_end = input_ports->end();
31310447Snilay@cs.wisc.edu            Map<PortInfo*>::ConstIterator it;
31410447Snilay@cs.wisc.edu            for(it = it_begin; it != it_end; ++it)
31510447Snilay@cs.wisc.edu            {
31610447Snilay@cs.wisc.edu                const String& net_name = it->first;
31710447Snilay@cs.wisc.edu                Log::printLine("Optimizing net: " + net_name);
31810447Snilay@cs.wisc.edu                timing_tree.performTimingOpt(timing_optimizer.getNet(net_name, makeNetIndex(0)), 1.0 / freq);
31910447Snilay@cs.wisc.edu                //timing_tree.performTimingOpt(electrical_model->getNet(net_name, makeNetIndex(0)), 1.0 / freq);
32010447Snilay@cs.wisc.edu            }
32110447Snilay@cs.wisc.edu            // Loop the second times
32210447Snilay@cs.wisc.edu            for(it = it_begin; it != it_end; ++it)
32310447Snilay@cs.wisc.edu            {
32410447Snilay@cs.wisc.edu                const String& net_name = it->first;
32510447Snilay@cs.wisc.edu                Log::printLine("Optimizing net: " + net_name);
32610447Snilay@cs.wisc.edu                //timing_tree.performTimingOpt(timing_optimizer.getNet(net_name, makeNetIndex(0)), 1.0 / freq);
32710447Snilay@cs.wisc.edu            }
32810447Snilay@cs.wisc.edu        }
32910447Snilay@cs.wisc.edu        else
33010447Snilay@cs.wisc.edu        {
33110447Snilay@cs.wisc.edu            // TODO : parse the net name so that we could do hierarchical optimization
33210447Snilay@cs.wisc.edu            // Currently we can only optimize timing at the top level
33310447Snilay@cs.wisc.edu            ElectricalModel* electrical_model = (ElectricalModel*)ms_model_;
33410447Snilay@cs.wisc.edu            ElectricalTimingTree timing_tree(electrical_model->getInstanceName(), electrical_model);
33510447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < start_net_names.size(); ++i)
33610447Snilay@cs.wisc.edu            {
33710447Snilay@cs.wisc.edu                const String& net_name = start_net_names[i];
33810447Snilay@cs.wisc.edu                timing_tree.performTimingOpt(electrical_model->getNet(net_name), 1.0 / freq);
33910447Snilay@cs.wisc.edu            }
34010447Snilay@cs.wisc.edu        }
34110447Snilay@cs.wisc.edu        return;
34210447Snilay@cs.wisc.edu    }
34310447Snilay@cs.wisc.edu
34410447Snilay@cs.wisc.edu    void DSENT::reportTiming()
34510447Snilay@cs.wisc.edu    {
34610447Snilay@cs.wisc.edu        Config* dsent_config = Config::getSingleton();
34710447Snilay@cs.wisc.edu
34810447Snilay@cs.wisc.edu        // Get all the starting net names
34910447Snilay@cs.wisc.edu        const vector<String>& start_net_names = dsent_config->get("ReportTiming->StartNetNames").split("[,]");
35010447Snilay@cs.wisc.edu
35110447Snilay@cs.wisc.edu        ElectricalModel* electrical_model = (ElectricalModel*)ms_model_;
35210447Snilay@cs.wisc.edu        ElectricalTimingTree timing_tree(electrical_model->getInstanceName(), electrical_model);
35310447Snilay@cs.wisc.edu
35410447Snilay@cs.wisc.edu        cout << "Report timing:" << endl;
35510447Snilay@cs.wisc.edu        cout << "==============" << endl;
35610447Snilay@cs.wisc.edu        for(unsigned int i = 0; i < start_net_names.size(); ++i)
35710447Snilay@cs.wisc.edu        {
35810447Snilay@cs.wisc.edu            const String& net_name = start_net_names[i];
35910447Snilay@cs.wisc.edu            double timing = timing_tree.performCritPathExtract(electrical_model->getNet(net_name));
36010447Snilay@cs.wisc.edu            cout << net_name << " = " << timing << endl;
36110447Snilay@cs.wisc.edu        }
36210447Snilay@cs.wisc.edu        cout << "==============" << endl;
36310447Snilay@cs.wisc.edu        return;
36410447Snilay@cs.wisc.edu    }
36510447Snilay@cs.wisc.edu
36610447Snilay@cs.wisc.edu    void DSENT::processEvaluate()
36710447Snilay@cs.wisc.edu    {
36810447Snilay@cs.wisc.edu        Config* dsent_config = Config::getSingleton();
36910447Snilay@cs.wisc.edu
37010447Snilay@cs.wisc.edu        // Return if EvaluatString is empty or not exists
37110447Snilay@cs.wisc.edu        if(!dsent_config->keyExist("EvaluateString")) return;
37210447Snilay@cs.wisc.edu
37310447Snilay@cs.wisc.edu        String eval_str = dsent_config->get("EvaluateString");
37410447Snilay@cs.wisc.edu
37510447Snilay@cs.wisc.edu        if(eval_str == "") return;
37610447Snilay@cs.wisc.edu
37710447Snilay@cs.wisc.edu        if(ms_is_verbose_)
37810447Snilay@cs.wisc.edu        {
37910447Snilay@cs.wisc.edu            cout << "Eval results:" << endl;
38010447Snilay@cs.wisc.edu            cout << "==============" << endl;
38110447Snilay@cs.wisc.edu        }
38210447Snilay@cs.wisc.edu
38310447Snilay@cs.wisc.edu        //if(ms_is_verbose_)
38410447Snilay@cs.wisc.edu        //{
38510447Snilay@cs.wisc.edu        //    String str = "Process evaluation: '" + eval_str + "'";
38610447Snilay@cs.wisc.edu        //    cout << str << endl;
38710447Snilay@cs.wisc.edu        //    cout << String(str.size(), '-') << endl;
38810447Snilay@cs.wisc.edu        //}
38910447Snilay@cs.wisc.edu        DSENTCalculator calc;
39010447Snilay@cs.wisc.edu        calc.evaluateString(eval_str);
39110447Snilay@cs.wisc.edu
39210447Snilay@cs.wisc.edu        if(ms_is_verbose_)
39310447Snilay@cs.wisc.edu        {
39410447Snilay@cs.wisc.edu            cout << "==============" << endl;
39510447Snilay@cs.wisc.edu        }
39610447Snilay@cs.wisc.edu        return;
39710447Snilay@cs.wisc.edu        return;
39810447Snilay@cs.wisc.edu    }
39910447Snilay@cs.wisc.edu
40010447Snilay@cs.wisc.edu    DSENT::DSENTCalculator::DSENTCalculator()
40110447Snilay@cs.wisc.edu    {}
40210447Snilay@cs.wisc.edu
40310447Snilay@cs.wisc.edu    DSENT::DSENTCalculator::~DSENTCalculator()
40410447Snilay@cs.wisc.edu    {}
40510447Snilay@cs.wisc.edu
40610447Snilay@cs.wisc.edu    double DSENT::DSENTCalculator::getEnvVar(const String& var_name_) const
40710447Snilay@cs.wisc.edu    {
40810447Snilay@cs.wisc.edu        if(m_var_.keyExist(var_name_))
40910447Snilay@cs.wisc.edu        {
41010447Snilay@cs.wisc.edu            return m_var_.get(var_name_);
41110447Snilay@cs.wisc.edu        }
41210447Snilay@cs.wisc.edu        else if(Config::getSingleton()->keyExist(var_name_))
41310447Snilay@cs.wisc.edu        {
41410447Snilay@cs.wisc.edu            return Config::getSingleton()->get(var_name_);
41510447Snilay@cs.wisc.edu        }
41610447Snilay@cs.wisc.edu        else
41710447Snilay@cs.wisc.edu        {
41810447Snilay@cs.wisc.edu            const Result* result = (const Result*)DSENT::processQuery(var_name_ + "@0", false);
41910447Snilay@cs.wisc.edu            return result->calculateSum();
42010447Snilay@cs.wisc.edu        }
42110447Snilay@cs.wisc.edu    }
42210447Snilay@cs.wisc.edu} // namespace DSENT
42310447Snilay@cs.wisc.edu
424