| 
						
						
						
						 |  | @@ -1,222 +1,222 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | /******************************************************************************* |  |  |  | /******************************************************************************* | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * Copyright (C) 2017, 2018 MINRES Technologies GmbH |  |  |  |  * Copyright (C) 2017, 2018 MINRES Technologies GmbH | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * All rights reserved. |  |  |  |  * All rights reserved. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * Redistribution and use in source and binary forms, with or without |  |  |  |  * Redistribution and use in source and binary forms, with or without | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * modification, are permitted provided that the following conditions are met: |  |  |  |  * modification, are permitted provided that the following conditions are met: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * 1. Redistributions of source code must retain the above copyright notice, |  |  |  |  * 1. Redistributions of source code must retain the above copyright notice, | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  *    this list of conditions and the following disclaimer. |  |  |  |  *    this list of conditions and the following disclaimer. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright notice, |  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  *    this list of conditions and the following disclaimer in the documentation |  |  |  |  *    this list of conditions and the following disclaimer in the documentation | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  *    and/or other materials provided with the distribution. |  |  |  |  *    and/or other materials provided with the distribution. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * 3. Neither the name of the copyright holder nor the names of its contributors |  |  |  |  * 3. Neither the name of the copyright holder nor the names of its contributors | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  *    may be used to endorse or promote products derived from this software |  |  |  |  *    may be used to endorse or promote products derived from this software | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  *    without specific prior written permission. |  |  |  |  *    without specific prior written permission. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |  |  |  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |  |  |  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |  |  |  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |  |  |  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |  |  |  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |  |  |  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |  |  |  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |  |  |  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * POSSIBILITY OF SUCH DAMAGE. |  |  |  |  * POSSIBILITY OF SUCH DAMAGE. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  *******************************************************************************/ |  |  |  |  *******************************************************************************/ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include <iostream> |  |  |  | #include <iostream> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include <vector> |  |  |  | #include <vector> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include <array> |  |  |  | #include <array> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include <iss/factory.h> |  |  |  | #include <iss/factory.h> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include <boost/lexical_cast.hpp> |  |  |  | #include <boost/lexical_cast.hpp> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include <boost/program_options.hpp> |  |  |  | #include <boost/program_options.hpp> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include "iss/arch/tgc_mapper.h" |  |  |  | #include "iss/arch/tgc_mapper.h" | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #ifdef WITH_LLVM |  |  |  | #ifdef WITH_LLVM | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include <iss/llvm/jit_init.h> |  |  |  | #include <iss/llvm/jit_init.h> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include <iss/log_categories.h> |  |  |  | #include <iss/log_categories.h> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include "iss/plugin/cycle_estimate.h" |  |  |  | #include "iss/plugin/cycle_estimate.h" | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include "iss/plugin/instruction_count.h" |  |  |  | #include "iss/plugin/instruction_count.h" | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #ifndef WIN32 |  |  |  | #ifndef WIN32 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include <iss/plugin/loader.h> |  |  |  | #include <iss/plugin/loader.h> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #if defined(HAS_LUA) |  |  |  | #if defined(HAS_LUA) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #include <iss/plugin/lua.h> |  |  |  | #include <iss/plugin/lua.h> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | namespace po = boost::program_options; |  |  |  | namespace po = boost::program_options; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | int main(int argc, char *argv[]) { |  |  |  | int main(int argc, char *argv[]) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     /* |  |  |  |     /* | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |      *  Define and parse the program options |  |  |  |      *  Define and parse the program options | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |      */ |  |  |  |      */ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     po::variables_map clim; |  |  |  |     po::variables_map clim; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     po::options_description desc("Options"); |  |  |  |     po::options_description desc("Options"); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     // clang-format off |  |  |  |     // clang-format off | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     desc.add_options() |  |  |  |     desc.add_options() | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("help,h", "Print help message") |  |  |  |         ("help,h", "Print help message") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("verbose,v", po::value<int>()->default_value(4), "Sets logging verbosity") |  |  |  |         ("verbose,v", po::value<int>()->default_value(4), "Sets logging verbosity") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("logfile,l", po::value<std::string>(), "Sets default log file.") |  |  |  |         ("logfile,l", po::value<std::string>(), "Sets default log file.") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("disass,d", po::value<std::string>()->implicit_value(""), "Enables disassembly") |  |  |  |         ("disass,d", po::value<std::string>()->implicit_value(""), "Enables disassembly") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("gdb-port,g", po::value<unsigned>()->default_value(0), "enable gdb server and specify port to use") |  |  |  |         ("gdb-port,g", po::value<unsigned>()->default_value(0), "enable gdb server and specify port to use") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("instructions,i", po::value<uint64_t>()->default_value(std::numeric_limits<uint64_t>::max()), "max. number of instructions to simulate") |  |  |  |         ("instructions,i", po::value<uint64_t>()->default_value(std::numeric_limits<uint64_t>::max()), "max. number of instructions to simulate") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("reset,r", po::value<std::string>(), "reset address") |  |  |  |         ("reset,r", po::value<std::string>(), "reset address") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("dump-ir", "dump the intermediate representation") |  |  |  |         ("dump-ir", "dump the intermediate representation") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("elf,f", po::value<std::vector<std::string>>(), "ELF file(s) to load") |  |  |  |         ("elf,f", po::value<std::vector<std::string>>(), "ELF file(s) to load") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("mem,m", po::value<std::string>(), "the memory input file") |  |  |  |         ("mem,m", po::value<std::string>(), "the memory input file") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("plugin,p", po::value<std::vector<std::string>>(), "plugin to activate") |  |  |  |         ("plugin,p", po::value<std::vector<std::string>>(), "plugin to activate") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("backend", po::value<std::string>()->default_value("interp"), "the ISS backend to use, options are: interp, tcc") |  |  |  |         ("backend", po::value<std::string>()->default_value("interp"), "the ISS backend to use, options are: interp, tcc") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ("isa", po::value<std::string>()->default_value("tgc5c"), "core or isa name to use for simulation, use '?' to get list"); |  |  |  |         ("isa", po::value<std::string>()->default_value("tgc5c"), "core or isa name to use for simulation, use '?' to get list"); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     // clang-format on |  |  |  |     // clang-format on | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     auto parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run(); |  |  |  |     auto parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     try { |  |  |  |     try { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         po::store(parsed, clim); // can throw |  |  |  |         po::store(parsed, clim); // can throw | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         // --help option |  |  |  |         // --help option | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         if (clim.count("help")) { |  |  |  |         if (clim.count("help")) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             std::cout << "DBT-RISE-RiscV simulator for RISC-V" << std::endl << desc << std::endl; |  |  |  |             std::cout << "DBT-RISE-TGC simulator for TGC RISC-V cores" << std::endl << desc << std::endl; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             return 0; |  |  |  |             return 0; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         po::notify(clim); // throws on error, so do after help in case |  |  |  |         po::notify(clim); // throws on error, so do after help in case | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     } catch (po::error &e) { |  |  |  |     } catch (po::error &e) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         // there are problems |  |  |  |         // there are problems | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         std::cerr << "ERROR: " << e.what() << std::endl << std::endl; |  |  |  |         std::cerr << "ERROR: " << e.what() << std::endl << std::endl; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         std::cerr << desc << std::endl; |  |  |  |         std::cerr << desc << std::endl; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         return 1; |  |  |  |         return 1; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     std::vector<std::string> args = collect_unrecognized(parsed.options, po::include_positional); |  |  |  |     std::vector<std::string> args = collect_unrecognized(parsed.options, po::include_positional); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     LOGGER(DEFAULT)::print_time() = false; |  |  |  |     LOGGER(DEFAULT)::print_time() = false; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     LOGGER(connection)::print_time() = false; |  |  |  |     LOGGER(connection)::print_time() = false; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     auto l = logging::as_log_level(clim["verbose"].as<int>()); |  |  |  |     auto l = logging::as_log_level(clim["verbose"].as<int>()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     LOGGER(DEFAULT)::reporting_level() = l; |  |  |  |     LOGGER(DEFAULT)::reporting_level() = l; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     LOGGER(connection)::reporting_level() = l; |  |  |  |     LOGGER(connection)::reporting_level() = l; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     if (clim.count("logfile")) { |  |  |  |     if (clim.count("logfile")) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         // configure the connection logger |  |  |  |         // configure the connection logger | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         auto f = fopen(clim["logfile"].as<std::string>().c_str(), "w"); |  |  |  |         auto f = fopen(clim["logfile"].as<std::string>().c_str(), "w"); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         LOG_OUTPUT(DEFAULT)::stream() = f; |  |  |  |         LOG_OUTPUT(DEFAULT)::stream() = f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         LOG_OUTPUT(connection)::stream() = f; |  |  |  |         LOG_OUTPUT(connection)::stream() = f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     std::vector<iss::vm_plugin *> plugin_list; |  |  |  |     std::vector<iss::vm_plugin *> plugin_list; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     auto res = 0; |  |  |  |     auto res = 0; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     try { |  |  |  |     try { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #ifdef WITH_LLVM |  |  |  | #ifdef WITH_LLVM | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         // application code comes here // |  |  |  |         // application code comes here // | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         iss::init_jit_debug(argc, argv); |  |  |  |         iss::init_jit_debug(argc, argv); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         bool dump = clim.count("dump-ir"); |  |  |  |         bool dump = clim.count("dump-ir"); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         auto & f = iss::core_factory::instance(); |  |  |  |         auto & f = iss::core_factory::instance(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         // instantiate the simulator |  |  |  |         // instantiate the simulator | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         iss::vm_ptr vm{nullptr}; |  |  |  |         iss::vm_ptr vm{nullptr}; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         iss::cpu_ptr cpu{nullptr}; |  |  |  |         iss::cpu_ptr cpu{nullptr}; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         std::string isa_opt(clim["isa"].as<std::string>()); |  |  |  |         std::string isa_opt(clim["isa"].as<std::string>()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         if(isa_opt.size()==0 || isa_opt == "?") { |  |  |  |         if(isa_opt.size()==0 || isa_opt == "?") { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             auto list = f.get_names(); |  |  |  |             auto list = f.get_names(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             std::sort(std::begin(list), std::end(list)); |  |  |  |             std::sort(std::begin(list), std::end(list)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             std::cout<<"Available implementations (core|platform|backend):\n  - "<<util::join(list, "\n  - ")<<std::endl; |  |  |  |             std::cout<<"Available implementations (core|platform|backend):\n  - "<<util::join(list, "\n  - ")<<std::endl; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             return 0; |  |  |  |             return 0; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } else if (isa_opt.find('|') != std::string::npos) { |  |  |  |         } else if (isa_opt.find('|') != std::string::npos) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             std::tie(cpu, vm) = f.create(isa_opt+"|"+clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); |  |  |  |             std::tie(cpu, vm) = f.create(isa_opt+"|"+clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } else { |  |  |  |         } else { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             auto base_isa = isa_opt.substr(0, 5); |  |  |  |             auto base_isa = isa_opt.substr(0, 5); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             if(base_isa=="tgc5d" || base_isa=="tgc5e") { |  |  |  |             if(base_isa=="tgc5d" || base_isa=="tgc5e") { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 isa_opt += "|mu_p_clic_pmp|"+clim["backend"].as<std::string>(); |  |  |  |                 isa_opt += "|mu_p_clic_pmp|"+clim["backend"].as<std::string>(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             } else { |  |  |  |             } else { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 isa_opt += "|m_p|"+clim["backend"].as<std::string>(); |  |  |  |                 isa_opt += "|m_p|"+clim["backend"].as<std::string>(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             std::tie(cpu, vm) = f.create(isa_opt, clim["gdb-port"].as<unsigned>()); |  |  |  |             std::tie(cpu, vm) = f.create(isa_opt, clim["gdb-port"].as<unsigned>()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         if(!cpu ){ |  |  |  |         if(!cpu ){ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             LOG(ERR) << "Could not create cpu for isa " << isa_opt << " and backend " <<clim["backend"].as<std::string>()<< std::endl; |  |  |  |             LOG(ERR) << "Could not create cpu for isa " << isa_opt << " and backend " <<clim["backend"].as<std::string>()<< std::endl; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             return 127; |  |  |  |             return 127; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         if(!vm ){ |  |  |  |         if(!vm ){ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             LOG(ERR) << "Could not create vm for isa " << isa_opt << " and backend " <<clim["backend"].as<std::string>()<< std::endl; |  |  |  |             LOG(ERR) << "Could not create vm for isa " << isa_opt << " and backend " <<clim["backend"].as<std::string>()<< std::endl; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             return 127; |  |  |  |             return 127; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         if (clim.count("plugin")) { |  |  |  |         if (clim.count("plugin")) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             for (std::string const& opt_val : clim["plugin"].as<std::vector<std::string>>()) { |  |  |  |             for (std::string const& opt_val : clim["plugin"].as<std::vector<std::string>>()) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 std::string plugin_name=opt_val; |  |  |  |                 std::string plugin_name=opt_val; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 std::string arg{""}; |  |  |  |                 std::string arg{""}; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 std::size_t found = opt_val.find('='); |  |  |  |                 std::size_t found = opt_val.find('='); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 if (found != std::string::npos) { |  |  |  |                 if (found != std::string::npos) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     plugin_name = opt_val.substr(0, found); |  |  |  |                     plugin_name = opt_val.substr(0, found); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     arg = opt_val.substr(found + 1, opt_val.size()); |  |  |  |                     arg = opt_val.substr(found + 1, opt_val.size()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #if defined(WITH_PLUGINS) |  |  |  | #if defined(WITH_PLUGINS) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 if (plugin_name == "ic") { |  |  |  |                 if (plugin_name == "ic") { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     auto *ic_plugin = new iss::plugin::instruction_count(arg); |  |  |  |                     auto *ic_plugin = new iss::plugin::instruction_count(arg); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     vm->register_plugin(*ic_plugin); |  |  |  |                     vm->register_plugin(*ic_plugin); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     plugin_list.push_back(ic_plugin); |  |  |  |                     plugin_list.push_back(ic_plugin); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 } else if (plugin_name == "ce") { |  |  |  |                 } else if (plugin_name == "ce") { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     auto *ce_plugin = new iss::plugin::cycle_estimate(arg); |  |  |  |                     auto *ce_plugin = new iss::plugin::cycle_estimate(arg); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     vm->register_plugin(*ce_plugin); |  |  |  |                     vm->register_plugin(*ce_plugin); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     plugin_list.push_back(ce_plugin); |  |  |  |                     plugin_list.push_back(ce_plugin); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 } else |  |  |  |                 } else | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #if !defined(WIN32) |  |  |  | #if !defined(WIN32) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     std::vector<char const*> a{}; |  |  |  |                     std::vector<char const*> a{}; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     if(arg.length()) |  |  |  |                     if(arg.length()) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                         a.push_back({arg.c_str()}); |  |  |  |                         a.push_back({arg.c_str()}); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     iss::plugin::loader l(plugin_name, {{"initPlugin"}}); |  |  |  |                     iss::plugin::loader l(plugin_name, {{"initPlugin"}}); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     auto* plugin = l.call_function<iss::vm_plugin*>("initPlugin", a.size(), a.data()); |  |  |  |                     auto* plugin = l.call_function<iss::vm_plugin*>("initPlugin", a.size(), a.data()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     if(plugin){ |  |  |  |                     if(plugin){ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                         vm->register_plugin(*plugin); |  |  |  |                         vm->register_plugin(*plugin); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                         plugin_list.push_back(plugin); |  |  |  |                         plugin_list.push_back(plugin); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     } else |  |  |  |                     } else | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     { |  |  |  |                     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                         LOG(ERR) << "Unknown plugin name: " << plugin_name << ", valid names are 'ce', 'ic'" << std::endl; |  |  |  |                         LOG(ERR) << "Unknown plugin name: " << plugin_name << ", valid names are 'ce', 'ic'" << std::endl; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                         return 127; |  |  |  |                         return 127; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         if (clim.count("disass")) { |  |  |  |         if (clim.count("disass")) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             vm->setDisassEnabled(true); |  |  |  |             vm->setDisassEnabled(true); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             LOGGER(disass)::reporting_level() = logging::INFO; |  |  |  |             LOGGER(disass)::reporting_level() = logging::INFO; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             LOGGER(disass)::print_time() = false; |  |  |  |             LOGGER(disass)::print_time() = false; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             auto file_name = clim["disass"].as<std::string>(); |  |  |  |             auto file_name = clim["disass"].as<std::string>(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             if (file_name.length() > 0) { |  |  |  |             if (file_name.length() > 0) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 LOG_OUTPUT(disass)::stream() = fopen(file_name.c_str(), "w"); |  |  |  |                 LOG_OUTPUT(disass)::stream() = fopen(file_name.c_str(), "w"); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 LOGGER(disass)::print_severity() = false; |  |  |  |                 LOGGER(disass)::print_severity() = false; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         uint64_t start_address = 0; |  |  |  |         uint64_t start_address = 0; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         if (clim.count("mem")) |  |  |  |         if (clim.count("mem")) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             vm->get_arch()->load_file(clim["mem"].as<std::string>()); |  |  |  |             vm->get_arch()->load_file(clim["mem"].as<std::string>()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         if (clim.count("elf")) |  |  |  |         if (clim.count("elf")) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             for (std::string input : clim["elf"].as<std::vector<std::string>>()) { |  |  |  |             for (std::string input : clim["elf"].as<std::vector<std::string>>()) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 auto start_addr = vm->get_arch()->load_file(input); |  |  |  |                 auto start_addr = vm->get_arch()->load_file(input); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 if (start_addr.second) start_address = start_addr.first; |  |  |  |                 if (start_addr.second) start_address = start_addr.first; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         for (std::string input : args) { |  |  |  |         for (std::string input : args) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             auto start_addr = vm->get_arch()->load_file(input); // treat remaining arguments as elf files |  |  |  |             auto start_addr = vm->get_arch()->load_file(input); // treat remaining arguments as elf files | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             if (start_addr.second) start_address = start_addr.first; |  |  |  |             if (start_addr.second) start_address = start_addr.first; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         if (clim.count("reset")) { |  |  |  |         if (clim.count("reset")) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             auto str = clim["reset"].as<std::string>(); |  |  |  |             auto str = clim["reset"].as<std::string>(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), nullptr, 16) : std::stoull(str, nullptr, 10); |  |  |  |             start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), nullptr, 16) : std::stoull(str, nullptr, 10); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         vm->reset(start_address); |  |  |  |         vm->reset(start_address); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         auto cycles = clim["instructions"].as<uint64_t>(); |  |  |  |         auto cycles = clim["instructions"].as<uint64_t>(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         res = vm->start(cycles, dump); |  |  |  |         res = vm->start(cycles, dump); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     } catch (std::exception &e) { |  |  |  |     } catch (std::exception &e) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         LOG(ERR) << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit" |  |  |  |         LOG(ERR) << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit" | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                    << std::endl; |  |  |  |                    << std::endl; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         res = 2; |  |  |  |         res = 2; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     // cleanup to let plugins report of needed |  |  |  |     // cleanup to let plugins report of needed | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     for (auto *p : plugin_list) { |  |  |  |     for (auto *p : plugin_list) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         delete p; |  |  |  |         delete p; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     return res; |  |  |  |     return res; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
	
		
		
			
				
					
					| 
						
						
						
						 |  |   |