1
0
mirror of https://github.com/open-simh/simh.git synced 2026-01-26 04:02:39 +00:00

CMake: Make generate.py reusable

Make generate.py resuable outside of open-simh, as suggested and
motivated by Richard Cornwell's simulator repository.

- Make the "experimental" rule optional. Do not generate a Python
  "KeyError" if the rule is missing.

- Add documentation on how to use the CMake infrastructure outside
  of open-simh: Customize the packaging.py script, season to taste.

- Update the KA10 simulator customization, moving it to its own
  Python script, simgen/pdp10_simulator.py. Preparatory move that
  anticipates additional frontpanel and display options.

- generate.py option "--skip-orphans": Skip the orphaned simulator
  check (i.e., don't cross-reference the simulators in packaging.py
  with what was scraped from the makefile.)

- Add "TEST_ARGS" argument to CMake's add_simulator function so that the
  IBM 1130 simulator can pass to "-g" on the command line to disable the
  GUI when running RegisterSanityCheck, i.e.:

    ibm1130 RegisterSanityCheck -g

  This fixes an edge case Heisenbug encountered during Github CI/CD
  tests where ibm1130 appears to hang indefinitely on the Windows
  runners.

  The cause is the GUI's Pump() thread function being prematurely
  terminated before all GUI resources are acquired. The net result is an
  infinite loop in the MS C runtime trying to exit the process with
  unstable internal state. (Separate patch: synchronization across main
  and Pump() threads to ensure resource acquisition completes.)

  This issue never shows up on non-Windows platforms or the SIMH makefile.

- cmake/generator.py, cmake/simgen: Add a "test_args" keyword argument
  to the BasicSimulator constructor that holds the tests argument
  parameter emitted as the "TEST_ARGS" argument to a simulator's
  add_simulator(). Ensure that the IBM 1130 emits 'TEST_ARG "-g"' in its
  add_simulator().

- scp.c: reset_all_p() adds 'P' to the existing switches, versus saving
  sim_switches and ONLY setting the 'P' power-up reset switch. Net effect
  is that the IBM 1130 simulator actually sees the 'G' flag that inhibits
  the GUI during the console device reset.
This commit is contained in:
B. Scott Michel
2024-03-15 20:44:34 -07:00
committed by Paul Koning
parent 24f145ad16
commit 191b2131e9
15 changed files with 342 additions and 169 deletions

View File

@@ -7,8 +7,9 @@ import simgen.packaging as SPKG
class SIMHBasicSimulator:
"""
"""
def __init__(self, sim_name, dir_macro, test_name, buildrom):
def __init__(self, sim_name, dir_macro, test_name, buildrom, test_args=None):
self.sim_name = sim_name
## self.dir_macro -> Directory macro (e.g., "${PDP11D}" for source
self.dir_macro = dir_macro
self.test_name = test_name
self.int64 = False
@@ -22,6 +23,11 @@ class SIMHBasicSimulator:
self.besm6_sdl_hack = False
## self.uses_aio -> True if the simulator uses AIO
self.uses_aio = False
## self.test_args -> Simulator flags to pass to the test phase. Used by ibm1130 to
## pass "-g" to disable to the GUI. This argument can be a single
## string or a list.
self.test_args = test_args
self.sources = []
self.defines = []
self.includes = []
@@ -128,6 +134,13 @@ class SIMHBasicSimulator:
stream.write('\n' + indent4 + "BESM6_SDL_HACK")
if self.uses_aio:
stream.write('\n' + indent4 + "USES_AIO")
if self.test_args:
out_args = self.test_args
if isinstance(self.test_args, str):
out_args = self.test_args.split()
out_args = ' '.join('"{0}"'.format(w) for w in out_args)
stream.write('\n' + indent4 + 'TEST_ARGS {}'.format(out_args))
if self.buildrom:
stream.write('\n' + indent4 + "BUILDROMS")
stream.write('\n' + indent4 + "LABEL " + test_label)
@@ -250,22 +263,6 @@ class BESM6Simulator(SIMHBasicSimulator):
'unset(cand_fonts)',
'unset(cand_fontdirs)\n']))
class KA10Simulator(SIMHBasicSimulator):
def __init__(self, sim_name, dir_macro, test_name, buildrom):
super().__init__(sim_name, dir_macro, test_name, buildrom)
def write_simulator(self, stream, indent, test_label='ka10'):
super().write_simulator(stream, indent, test_label)
stream.write('\n')
stream.write('\n'.join([
'if (PANDA_LIGHTS)',
' target_sources({0} PUBLIC {1}/ka10_lights.c)'.format(self.sim_name, self.dir_macro),
' target_compile_definitions({0} PUBLIC PANDA_LIGHTS)'.format(self.sim_name),
' target_link_libraries({0} PUBLIC usb-1.0)'.format(self.sim_name),
'endif (PANDA_LIGHTS)'
]))
stream.write('\n')
class IBM650Simulator(SIMHBasicSimulator):
'''The IBM650 simulator creates relatively deep stacks, which will fail on Windows.
Adjust target simulator link flags to provide a 8M stack, similar to Linux.
@@ -293,25 +290,6 @@ class IBM650Simulator(SIMHBasicSimulator):
'endif()'
]))
class IBM1130Simulator(SIMHBasicSimulator):
'''The IBM650 simulator creates relatively deep stacks, which will fail on Windows.
Adjust target simulator link flags to provide a 8M stack, similar to Linux.
'''
def __init__(self, sim_name, dir_macro, test_name, buildrom):
super().__init__(sim_name, dir_macro, test_name, buildrom)
def write_simulator(self, stream, indent, test_label='ibm650'):
super().write_simulator(stream, indent, test_label)
stream.write('\n'.join([
'',
'if (WIN32)',
' target_compile_definitions(ibm1130 PRIVATE GUI_SUPPORT)',
' ## missing source in IBM1130?'
' ## target_sources(ibm1130 PRIVATE ibm1130.c)',
'endif()'
]))
if '_dispatch' in pprint.PrettyPrinter.__dict__:
def sim_pprinter(pprinter, sim, stream, indent, allowance, context, level):
cls = sim.__class__