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