Exemple #1
0
int main(int argc, char *argv[]){

  int res = 0;
  shrdPtr= (struct wonk*)malloc(sizeof(struct wonk));
  shrdPtr->a = 1;

  pthread_mutex_init(&lock,NULL);

	START_TIME();
  pthread_t acc[7],upd;
  pthread_create(&acc[0],NULL,accessorThread,(void*)shrdPtr);
  pthread_create(&acc[1],NULL,accessorThread,(void*)shrdPtr);
  pthread_create(&acc[2],NULL,accessorThread,(void*)shrdPtr);
  pthread_create(&acc[3],NULL,accessorThread,(void*)shrdPtr);
  pthread_create(&acc[4],NULL,accessorThread,(void*)shrdPtr);
  pthread_create(&acc[5],NULL,accessorThread,(void*)shrdPtr);
  pthread_create(&acc[6],NULL,accessorThread,(void*)shrdPtr);
  pthread_create(&upd,NULL,updaterThread,(void*)shrdPtr);

  pthread_join(upd,NULL);
  pthread_join(acc[0],(void*)&res);
  pthread_join(acc[1],(void*)&res);
  pthread_join(acc[2],(void*)&res);
  pthread_join(acc[3],(void*)&res);
  pthread_join(acc[4],(void*)&res);
  pthread_join(acc[5],(void*)&res);
  pthread_join(acc[6],(void*)&res);
	STOP_TIME();
  fprintf(stderr,"Final value of res was %d\n",res); 
	PRINT_TIME();
}
Exemple #2
0
void framerate_clean()
{
   if(!graf_init_lfb()) return;
   START_TIME(timer);
   for(int i = 0; i < 1000; i++) clear(i);
   STOP_TIME(timer);
   fps_clean = FPS(1000,timer);
   graf_close();
}
Exemple #3
0
DesignFlowStep_Status values_scheme::InternalExec()
{
   long step_time;
   START_TIME(step_time);
   THROW_ASSERT(HLS->Rliv, "Liveness analysis not yet computed");
   unsigned int i = 0;
   const std::list<vertex> & support = HLS->Rliv->get_support();

   const std::list<vertex>::const_iterator vEnd = support.end();
   for(std::list<vertex>::const_iterator vIt = support.begin(); vIt != vEnd; vIt++)
   {
      //std::cerr << "current state for sv " << HLS->Rliv->get_name(*vIt) << std::endl;
      const std::set<unsigned int>& live = HLS->Rliv->get_live_in(*vIt);
      const std::set<unsigned int>::const_iterator k_end = live.end();
      for(std::set<unsigned int>::const_iterator k = live.begin(); k != k_end; k++)
      {
         if(HLS->storage_value_information->storage_index_map.find(*k) == HLS->storage_value_information->storage_index_map.end())
         {
            HLS->storage_value_information->storage_index_map[*k] = i;
            HLS->storage_value_information->variable_index_vect.push_back(*k);
            i++;
         }
      }
   }
   HLS->storage_value_information->number_of_storage_values = i;
   if(output_level <= OUTPUT_LEVEL_PEDANTIC)
      INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "");
   INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "-->Storage Value Information of function " + HLSMgr->CGetFunctionBehavior(funId)->CGetBehavioralHelper()->get_function_name() + ":");
   INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "---Number of storage values inserted: "+boost::lexical_cast<std::string>(i));
   STOP_TIME(step_time);
   if(output_level >= OUTPUT_LEVEL_MINIMUM and output_level <= OUTPUT_LEVEL_PEDANTIC)
      INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "Time to compute storage value information: " + print_cpu_time(step_time) + " seconds");
   INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "<--");
   if(output_level <= OUTPUT_LEVEL_PEDANTIC)
      INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "");
   return DesignFlowStep_Status::SUCCESS;
}
int main(int argc, char* argv[]) {
// 	if (argc != 7) {
// 		fprintf(stderr, "Usage: %s <N> <N> <block size> <block size> <index> <B|PW|SEQ>\n", argv[0]);
// 		return 1;
// 	}
	parseInitializationType("SEQ");
	long N = 100;
	long BS = 20;
	// long L = atol(argv[4]);
	long L = 16;
	
	if (BS > N) {
		printf("0");
		return 1;
	}
	
	typedef double (*m_t)[N/BS + 2][BS][BS];
	
	m_t A = (m_t) alloc_and_gen_matrix(N + BS*2, BS);
	
	
	for (int i=0; i<N/BS; ++i) {
	  for (int j=0; j<N/BS; ++j) {
	    for (int k=0; k<BS; ++k) {
	      for (int l=0; l<BS; ++l) {
		//printf (" %f", A[i][j][k][l]);
	      }
	    }
// 	    printf ("\n");
	  }
	}
// 	printf ("\n");
	
	
	#pragma omp taskwait
	
	Extrae_init();
	printf("extrae init\n");
	START_TIME();
	for (int iters=0; iters<L; iters++) {
		for (long i=1; i <= N/BS; i++) {
			for (long j=1; j <= N/BS; j++) {
				wrapperxxxxxxx(i, j, (N+BS+BS), BS, A[i][j], A[i-1][j], A[i][j-1], A[i+1][j], A[i][j+1]);
			}
		}
	}
	printf("extrae fini\n");
	Extrae_fini();
  
	#pragma omp taskwait
	STOP_TIME();
	
	//#pragma omp critical 
	{
	for (int iters=0; iters<N; iters++) {
		for (int i=0; i <= N; i++) {
			//printf (" %f", *A[iters][i]);
		}
// 		printf ("\n");
	}
// 	printf ("\n");
	}
	
	if (getenv("MEASURE_TIME") == NULL) {
		// Megaelements per second
		printf("%f", ((double)(L*N*N))/GET_TIME());
	} else {
		printf("%f", GET_TIME() / 1000000.0);
	}
	
	return 0;
}
DesignFlowStep_Status weighted_clique_register::InternalExec()
{
   const FunctionBehaviorConstRef FB = HLSMgr->CGetFunctionBehavior(funId);
   long step_time;
   START_TIME(step_time);
   const CliqueCovering_Algorithm clique_covering_algorithm = GetPointer<const WeightedCliqueRegisterBindingSpecialization>(hls_flow_step_specialization)->clique_covering_algorithm;
   refcount< clique_covering<CG_vertex_descriptor> > register_clique = clique_covering<CG_vertex_descriptor>::create_solver(clique_covering_algorithm);
   create_compatibility_graph();

   std::vector<CG_vertex_descriptor>::const_iterator v_it_end = verts.end();
   unsigned int vertex_index = 0;
   unsigned int num_registers = 0;
   for(std::vector<CG_vertex_descriptor>::const_iterator v_it = verts.begin(); v_it != v_it_end; ++v_it, ++vertex_index)
      register_clique->add_vertex(*v_it, STR(vertex_index));
   if(vertex_index>0)
   {
      boost::graph_traits<compatibility_graph>::edge_iterator cg_ei,cg_ei_end;
      for(boost::tie(cg_ei,cg_ei_end) = boost::edges(CG); cg_ei != cg_ei_end; ++cg_ei)
      {
         CG_vertex_descriptor src = boost::source(*cg_ei, CG);
         CG_vertex_descriptor tgt = boost::target(*cg_ei, CG);
         register_clique->add_edge(src, tgt, CG[*cg_ei].weight);
      }
      if(parameters->getOption<bool>(OPT_print_dot))
      {
         const auto functionName = FB->CGetBehavioralHelper()->get_function_name();
         const auto output_directory = parameters->getOption<std::string>(OPT_dot_directory) + "/" + functionName + "/";
         if (!boost::filesystem::exists(output_directory))
            boost::filesystem::create_directories(output_directory);
         const auto file_name = output_directory + "HLS_RegisterBinding.dot";
         register_clique->writeDot(file_name);
      }
      /// performing clique covering
      no_check_clique<CG_vertex_descriptor> cq;
      register_clique->exec(no_filter_clique<CG_vertex_descriptor>(), cq);
      /// vertex to clique map
      std::map<CG_vertex_descriptor, unsigned int> v2c;
      /// retrieve the solution
      num_registers = static_cast<unsigned int>(register_clique->num_vertices());
      for (unsigned int i = 0; i < num_registers; ++i)
      {
         std::set<CG_vertex_descriptor> clique = register_clique->get_clique(i);
         std::set<CG_vertex_descriptor>::const_iterator v_end = clique.end();
         for (std::set<CG_vertex_descriptor>::const_iterator v = clique.begin(); v != v_end; ++v)
         {
            v2c[*v] = i;
         }
      }
      /// finalize
      HLS->Rreg = reg_bindingRef(new reg_binding(HLS, HLSMgr));
      const std::list<vertex> & support = HLS->Rliv->get_support();

      const std::list<vertex>::const_iterator vEnd = support.end();
      for(std::list<vertex>::const_iterator vIt = support.begin(); vIt != vEnd; vIt++)
      {
         const std::set<unsigned int>& live = HLS->Rliv->get_live_in(*vIt);
         std::set<unsigned int>::iterator k_end = live.end();
         for(std::set<unsigned int>::iterator k = live.begin(); k != k_end; k++)
         {
            unsigned int storage_value_index = HLS->storage_value_information->get_storage_value_index(*vIt, *k);
            HLS->Rreg->bind(storage_value_index, v2c[verts[storage_value_index]]);
         }
      }
   }
   else
   {
      HLS->Rreg = reg_bindingRef(new reg_binding(HLS, HLSMgr));
      num_registers = 0;
   }
   HLS->Rreg->set_used_regs(num_registers);
   STOP_TIME(step_time);
   if(output_level <= OUTPUT_LEVEL_PEDANTIC)
      INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "");
   INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "-->Register binding information for function " + FB->CGetBehavioralHelper()->get_function_name() + ":");
   INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, std::string("---Register allocation algorithm obtains ") + (num_registers == register_lower_bound ? "an optimal" : "a sub-optimal") + " result: " + STR(num_registers) + " registers"+(num_registers == register_lower_bound?"":("(LB:"+STR(register_lower_bound)+")")));
   if (output_level >= OUTPUT_LEVEL_VERY_PEDANTIC)
      HLS->Rreg->print();
   if(output_level >= OUTPUT_LEVEL_MINIMUM and output_level <= OUTPUT_LEVEL_PEDANTIC)
      INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "Time to perform register binding: " + print_cpu_time(step_time) + " seconds");
   INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "<--");
   if(output_level <= OUTPUT_LEVEL_PEDANTIC)
      INDENT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "");
   return DesignFlowStep_Status::SUCCESS;
}
Exemple #6
0
int main(int argc, char *argv[])
{
   // Program name

   ParameterRef parameters;

   try
   {
      // ---------- General options ------------ //
      // Synthesis cpu time
      long total_time;
      START_TIME(total_time);
      // General options register

      // ---------- Initialization ------------ //

      // ---------- Parameter parsing ------------ //
      long cpu_time;
      START_TIME(cpu_time);
      parameters = ParameterRef(new EucalyptusParameter(argv[0], argc, argv));

      switch(parameters->Exec())
      {
         case PARAMETER_NOTPARSED:
         {
            exit_code = PARAMETER_NOTPARSED;
            throw "Bad Parameters format";
         }
         case EXIT_SUCCESS:
         {
            if(not (parameters->getOption<bool>(OPT_no_clean)))
            {
               boost::filesystem::remove_all(parameters->getOption<std::string>(OPT_output_temporary_directory));
            }
            return EXIT_SUCCESS;
         }
         case PARAMETER_PARSED:
         {
            exit_code = EXIT_FAILURE;
            break;
         }
         default:
         {
            THROW_ERROR("Bad Parameters parsing");
         }
      }

      int output_level = parameters->getOption<int>(OPT_output_level);
      STOP_TIME(cpu_time);
      if(output_level >= OUTPUT_LEVEL_MINIMUM)
         parameters->PrintFullHeader(std::cerr);

      /// eucalyptus does not perform a clock constrained synthesis
      if(!parameters->isOption(OPT_clock_period))
         parameters->setOption(OPT_clock_period, 0.0);

      // Technology library manager
      technology_managerRef TM = technology_managerRef(new technology_manager(parameters));


      ///creating the datastructure representing the target device
      const auto target_device = static_cast<TargetDevice_Type>(parameters->getOption<unsigned int>(OPT_target_device_type));
      target_deviceRef device = target_device::create_device(target_device, parameters, TM);
      device->set_parameter("clock_period", parameters->getOption<double>(OPT_clock_period));
      target_managerRef target = target_managerRef(new target_manager(parameters, TM, device));

      const DesignFlowManagerRef design_flow_manager(new DesignFlowManager(parameters));
      const DesignFlowGraphConstRef design_flow_graph = design_flow_manager->CGetDesignFlowGraph();

      const DesignFlowStepFactoryConstRef technology_flow_step_factory(new TechnologyFlowStepFactory(TM, device, design_flow_manager, parameters));
      design_flow_manager->RegisterFactory(technology_flow_step_factory);

      const std::string technology_flow_signature = TechnologyFlowStep::ComputeSignature(TechnologyFlowStep_Type::LOAD_TECHNOLOGY);
      const vertex technology_flow_step = design_flow_manager->GetDesignFlowStep(technology_flow_signature);
      const DesignFlowStepRef technology_design_flow_step = technology_flow_step ? design_flow_graph->CGetDesignFlowStepInfo(technology_flow_step)->design_flow_step : GetPointer<const TechnologyFlowStepFactory>(technology_flow_step_factory)->CreateTechnologyFlowStep(TechnologyFlowStep_Type::LOAD_TECHNOLOGY);
      design_flow_manager->AddStep(technology_design_flow_step);


#if HAVE_XILINX || HAVE_ALTERA || HAVE_LATTICE || HAVE_DESIGN_COMPILER
      if(parameters->isOption(OPT_component_name))
      {
         const DesignFlowStepRef design_flow_step(new RTLCharacterization(target, parameters->getOption<std::string>(OPT_component_name), design_flow_manager, parameters));
         design_flow_manager->AddStep(design_flow_step);
      }
#endif
      design_flow_manager->Exec();

#if HAVE_EXPERIMENTAL
      if (parameters->isOption(OPT_import_ip_core))
      {
         START_TIME(cpu_time);
         std::string core_hdl = parameters->getOption<std::string>(OPT_import_ip_core);
         core_generationRef core_gen = core_generationRef(new core_generation(parameters));
         core_gen->convert_to_XML(core_hdl, device->get_type());
         STOP_TIME(cpu_time);
         PRINT_OUT_MEX(DEBUG_LEVEL_MINIMUM, output_level, " ==== Core generation performed in " + print_cpu_time(cpu_time) + " seconds; ====\n");
      }

      if (parameters->isOption(OPT_export_ip_core))
      {
         START_TIME(cpu_time);
         std::string core_name = parameters->getOption<std::string>(OPT_export_ip_core);
         core_generationRef core_gen = core_generationRef(new core_generation(parameters));
         core_gen->export_core(TM, core_name);
         STOP_TIME(cpu_time);
         PRINT_OUT_MEX(DEBUG_LEVEL_MINIMUM, output_level, " ==== Core exported in " + print_cpu_time(cpu_time) + " seconds; ====\n");
      }
#endif
      STOP_TIME(total_time);
      PRINT_MSG(" ==== Total Execution Time: " + print_cpu_time(total_time) + " seconds; ====\n");

      if(not (parameters->getOption<bool>(OPT_no_clean)))
      {
         boost::filesystem::remove_all(parameters->getOption<std::string>(OPT_output_temporary_directory));
      }
      return EXIT_SUCCESS; // Eucalyptus tool has completed execution without errors
   }

   // exception catching
   catch (const char * str)
   {
      std::cerr << str << std::endl;
   }
   catch (const std::string& str)
   {
      std::cerr << str << std::endl;
   }
   catch (std::exception &e)
   {
      std::cerr << e.what() << std::endl;
   }
   catch (...)
   {
      std::cerr << "Unknown error type" << std::endl;
   }

   switch(exit_code)
   {
      case PARAMETER_NOTPARSED:
      {
         parameters->PrintUsage(std::cout);
         break;
      }
      case EXIT_FAILURE:
      {
         parameters->PrintBugReport(std::cout);
         break;
      }
      default:
      {

      }
   }
   if(parameters and not (parameters->getOption<bool>(OPT_no_clean)))
   {
      boost::filesystem::remove_all(parameters->getOption<std::string>(OPT_output_temporary_directory));
   }
   return exit_code;

}
Exemple #7
0
syntax_error *lang_CPP::definitionsModified(const char* wscode, const char* targetYaml)
{
  cout << "Parsing settings..." << endl;
    parse_ide_settings(targetYaml);
  
  cout << targetYaml << endl;
  
  cout << "Creating swap." << endl;
  delete main_context;
  main_context = new jdi::context();
  
  cout << "Dumping whiteSpace definitions..." << endl;
  FILE *of = wscode ? fopen((makedir +"Preprocessor_Environment_Editable/IDE_EDIT_whitespace.h").c_str(),"wb") : NULL;
  if (of) fputs(wscode,of), fclose(of);
  
  cout << "Opening ENIGMA for parse..." << endl;
  
  llreader f("ENIGMAsystem/SHELL/SHELLmain.cpp");
  int res = 1;
  DECLARE_TIME();
  if (f.is_open()) {
    START_TIME();
    res = main_context->parse_C_stream(f, "SHELLmain.cpp");
    STOP_TIME();
  }
  
  jdi::definition *d;
  if ((d = main_context->get_global()->look_up("variant"))) {
    enigma_type__variant = d;   
    if (!(d->flags & jdi::DEF_TYPENAME))
      cerr << "ERROR! ENIGMA's variant is not a type!" << endl;
    else
      cout << "Successfully loaded builtin variant type" << endl;
  } else cerr << "ERROR! No variant type found!" << endl;
  if ((d = main_context->get_global()->look_up("var"))) {
    enigma_type__var = d;
    if (!(d->flags & jdi::DEF_TYPENAME))
      cerr << "ERROR! ENIGMA's var is not a type!" << endl;
    else
      cout << "Successfully loaded builtin var type" << endl;
  } else cerr << "ERROR! No var type found!" << endl;
  if ((d = main_context->get_global()->look_up("enigma"))) {
    if (d->flags & jdi::DEF_NAMESPACE) {
      if ((d = ((jdi::definition_scope*)d)->look_up("varargs"))) {
        enigma_type__varargs = d;
        if (!(d->flags & jdi::DEF_TYPENAME))
          cerr << "ERROR! ENIGMA's varargs is not a type!" << endl;
        else
          cout << "Successfully loaded builtin varargs type" << endl;
      } else cerr << "ERROR! No varargs type found!" << endl;
    } else cerr << "ERROR! Namespace enigma is... not a namespace!" << endl;
  } else cerr << "ERROR! Namespace enigma not found!" << endl;
  
  if (res) {
    cout << "ERROR in parsing engine file: The parser isn't happy. Don't worry, it's never happy.\n";
    cout << heaping_pile_of_dog_shit;
    
    ide_passback_error.set(0,0,0,"Parse failed; details in stdout. Bite me.");
    cout << "Continuing anyway." << endl;
    // return &ide_passback_error;
  } else {    
    cout << "Successfully parsed ENIGMA's engine (" << PRINT_TIME() << "ms)\n"
    << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
    //cout << "Namespace std contains " << global_scope.members["std"]->members.size() << " items.\n";
  }
  
  cout << "Creating dummy primitives for old ENIGMA" << endl;
  for (jdip::tf_iter it = jdip::builtin_declarators.begin(); it != jdip::builtin_declarators.end(); ++it) {
    main_context->get_global()->members[it->first] = new jdi::definition(it->first, main_context->get_global(), jdi::DEF_TYPENAME);
  }
  
  cout << "Initializing EDL Parser...\n";
  
  parser_init();
  
  cout << "Grabbing locals...\n";
  
  shared_locals_load(requested_extensions);
  
  cout << "Determining build target...\n";
  
  extensions::determine_target();
  
  cout << " Done.\n";
  
  return &ide_passback_error;
}
void read_technology_library(technology_managerRef TM, const ParameterConstRef Param, const target_deviceRef device)
{
#if HAVE_EXPERIMENTAL || HAVE_FROM_LIBERTY || HAVE_LIBRARY_COMPILER
   int output_level = Param->getOption<int>(OPT_output_level);
#endif
#ifndef NDEBUG
   int debug_level = Param->get_class_debug_level("parse_technology");
#endif

#if HAVE_FROM_LIBERTY
   //parsing of liberty format
   if (Param->isOption(OPT_input_liberty_library_file))
   {
      long lib2xmlTime;
      std::string LibFile = Param->getOption<std::string>(OPT_input_liberty_library_file);

      std::string XmlList;
      std::vector<std::string> SplittedLibs;
      boost::algorithm::split(SplittedLibs, LibFile, boost::algorithm::is_any_of(";"));
      for (unsigned int i = 0; i < SplittedLibs.size(); i++)
      {
         if (SplittedLibs.size() == 0) continue;
         boost::trim(SplittedLibs[i]);
         std::vector<std::string> SplittedLib;
         boost::algorithm::split(SplittedLib, SplittedLibs[i], boost::algorithm::is_any_of(":"));
         std::string LibraryFile, LibraryName;
         if (SplittedLib.size() < 1 or SplittedLib.size() > 2)
            THROW_ERROR("Malformed input liberty description: \"" + SplittedLibs[i] + "\"");
         if (SplittedLib.size() == 1)
         {
            LibraryFile = SplittedLib[0];
         }
         else
         {
            LibraryName = SplittedLib[0];
            LibraryFile = SplittedLib[1];
         }
         if (!boost::filesystem::exists(LibraryFile))
            THROW_ERROR("Liberty file \"" + LibraryFile + "\" does not exists!");
         START_TIME(lib2xmlTime);
         std::string TargetXML = Param->getOption<std::string>(OPT_output_temporary_directory) + "/library_" + boost::lexical_cast<std::string>(i) + ".xml";
         lib2xml(LibraryFile, TargetXML, Param);
         if (XmlList.size()) XmlList += ";";
         XmlList += TargetXML;
         STOP_TIME(lib2xmlTime);
         PRINT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "(koala) Read and converted the liberty file \"" + LibraryFile + "\" in "
                       + boost::lexical_cast<std::string>(print_cpu_time(lib2xmlTime)) + " seconds;\n");
      }
      ///FIXME: setting parameters
      const_cast<Parameter *>(Param.get())->setOption("input_xml_library_file", XmlList);
   }
#endif

#if HAVE_BOOLEAN_PARSER_BUILT
   if (Param->isOption("input_genlib_library_file"))
   {
      long genlibTime;
      START_TIME(genlibTime);
      PRINT_DBG_MEX(DEBUG_LEVEL_VERBOSE, debug_level, "(koala) Reading the genlib technology library");
      std::string LibraryName = Param->getOption<std::string>("genlib_library_file");
      technology_managerRef local_TM = technology_managerRef(new technology_manager(Param));
      read_genlib_technology_File(LibraryName, local_TM, Param);
      STOP_TIME(genlibTime);
      PRINT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "(koala) Read the technology library file \"" + LibraryName + "\" in "
                    + boost::lexical_cast<std::string>(print_cpu_time(genlibTime)) + " seconds;\n");
      write_technology_File(technology_manager::XML, "genlib", local_TM, device->get_type());
      ///FIXME: setting parameters
      const_cast<Parameter *>(Param.get())->setOption("input_xml_library_file", "genlib.xml");
      const_cast<Parameter *>(Param.get())->removeOption("input_genlib_library_file");
   }
#endif

   if (Param->isOption("input_xml_library_file"))
   {
      PRINT_DBG_MEX(DEBUG_LEVEL_VERBOSE, debug_level, "(koala) Reading the XML technology library");

      std::string LibraryName;
      std::string XmlLibraryList = Param->getOption<std::string>("input_xml_library_file");
      std::vector<std::string> SplittedLibs;
      boost::algorithm::split(SplittedLibs, XmlLibraryList, boost::algorithm::is_any_of(";"));
      for (unsigned int i = 0; i < SplittedLibs.size(); i++)
      {
         if (SplittedLibs.size() == 0) continue;
         LibraryName = SplittedLibs[i];
         long xmlTime;
         START_TIME(xmlTime);
         read_technology_File(SplittedLibs[i], TM, Param, device);
         STOP_TIME(xmlTime);
         PRINT_DBG_MEX(DEBUG_LEVEL_VERBOSE, debug_level, "(koala) Read the XML technology library file \"" + LibraryName + "\" in "
                       + boost::lexical_cast<std::string>(print_cpu_time(xmlTime)) + " seconds;\n");
      }

#if HAVE_BOOLEAN_PARSER_BUILT
      if (Param->getOption<bool>(OPT_dump_genlib))
      {
         std::string genlib_name(LibraryName.substr(0, LibraryName.find_last_of('.')) + ".genlib");
         PRINT_DBG_MEX(DEBUG_LEVEL_VERBOSE, debug_level, "(koala) Dumping the technology library in genlib format");
#if HAVE_CIRCUIT_BUILT
         dump_genlib(genlib_name, TM);
#endif
      }
#endif
   }

#if HAVE_EXPERIMENTAL
   if (Param->isOption("input_lef_library_file"))
   {
      std::string FileList = Param->getOption<std::string>("input_lef_library_file");
      std::vector<std::string> SplittedLibs;
      boost::algorithm::split(SplittedLibs, FileList, boost::algorithm::is_any_of(";"));
      for (unsigned int i = 0; i < SplittedLibs.size(); i++)
      {
         if (SplittedLibs.size() == 0) continue;
         boost::trim(SplittedLibs[i]);

         std::vector<std::string> SplittedName;
         boost::algorithm::split(SplittedName, SplittedLibs[i], boost::algorithm::is_any_of(":"));

         if (SplittedName.size() != 2) THROW_ERROR("Malformed LEF description: \"" + SplittedLibs[i] + "\"");
         std::string LibraryName = SplittedName[0];
         std::string LefFileName = SplittedName[1];

         if (!boost::filesystem::exists(LefFileName))
            THROW_ERROR("Lef file \"" + LefFileName + "\" does not exists!");

         if (!TM->is_library_manager(LibraryName))
            THROW_ERROR("Library \"" + LibraryName + "\" is not contained into the datastructure");
         const library_managerRef& LM = TM->get_library_manager(LibraryName);
         LM->set_info(library_manager::LEF, LefFileName);

         PRINT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "(koala) Stored LEF file \"" + LefFileName + "\" for library \""
                       + LibraryName + "\";\n");
      }
   }
#endif

#if HAVE_LIBRARY_COMPILER
   if (Param->isOption("input_db_library_file"))
   {
      std::string FileList = Param->getOption<std::string>("input_db_library_file");
      std::vector<std::string> SplittedLibs;
      boost::algorithm::split(SplittedLibs, FileList, boost::algorithm::is_any_of(";"));
      for (unsigned int i = 0; i < SplittedLibs.size(); i++)
      {
         if (SplittedLibs.size() == 0) continue;
         boost::trim(SplittedLibs[i]);

         std::vector<std::string> SplittedName;
         boost::algorithm::split(SplittedName, SplittedLibs[i], boost::algorithm::is_any_of(":"));

         if (SplittedName.size() != 2) THROW_ERROR("Malformed db description: \"" + SplittedLibs[i] + "\"");
         std::string LibraryName = SplittedName[0];
         std::string dbFileName = SplittedName[1];

         if (!TM->is_library_manager(LibraryName))
            THROW_ERROR("Library \"" + LibraryName + "\" is not contained into the datastructure");
         const library_managerRef LM = TM->get_library_manager(LibraryName);
         LM->set_info(library_manager::DB, dbFileName);

         PRINT_OUT_MEX(OUTPUT_LEVEL_MINIMUM, output_level, "(koala) Stored DB file \"" + dbFileName + "\" for library \""
                       + LibraryName + "\";\n");
      }
   }
#endif
}