# /// script # requires-python = ">=3.10" # dependencies = [] # /// # ─── How to run ─── # build/X86/gem5.opt --outdir=run se_timing.py /absolute/path/to/linux-x86-64-static-elf """Pending gem5 config: syntax checked only; gem5 compatibility is untested.""" import sys import m5 from m5.objects import ( AddrRange, DDR3_1600_8x8, MemCtrl, Process, Root, SEWorkload, SrcClockDomain, System, SystemXBar, VoltageDomain, X86TimingSimpleCPU, ) if len(sys.argv) != 2: raise SystemExit("supply one Linux x86-64 static ELF path") system = System() system.clk_domain = SrcClockDomain(clock="1GHz", voltage_domain=VoltageDomain()) system.mem_mode = "timing" system.mem_ranges = [AddrRange("512MiB")] system.cpu = X86TimingSimpleCPU() system.membus = SystemXBar() system.cpu.icache_port = system.membus.cpu_side_ports system.cpu.dcache_port = system.membus.cpu_side_ports system.cpu.createInterruptController() system.cpu.interrupts[0].pio = system.membus.mem_side_ports system.cpu.interrupts[0].int_requestor = system.membus.cpu_side_ports system.cpu.interrupts[0].int_responder = system.membus.mem_side_ports system.system_port = system.membus.cpu_side_ports system.mem_ctrl = MemCtrl() system.mem_ctrl.dram = DDR3_1600_8x8() system.mem_ctrl.dram.range = system.mem_ranges[0] system.mem_ctrl.port = system.membus.mem_side_ports system.workload = SEWorkload.init_compatible(sys.argv[1]) process = Process() process.cmd = [sys.argv[1]] system.cpu.workload = process system.cpu.createThreads() root = Root(full_system=False, system=system) m5.instantiate() m5.stats.reset() exit_event = m5.simulate() m5.stats.dump() print(f"tick={m5.curTick()} cause={exit_event.getCause()} code={exit_event.getCode()}")