Okay, we're going to try to rework this, so be on notice that things are going to be changing for a little while.
What's discussed on this page is a pulse-level simulator for the ENIAC. It's written in Go (and other languages for visualization) and simulates the machine at a very low level. The operation of the ENIAC is simulated at the level of individual pulses. For example, if one accumulator sends the digit 5 to another, it does so by sending 5 pulses. That operation is simulated here by sending 5 messages over Go channels. The reason for simulating it at this level of detail is a desire on my part to use the simulator to better understand exactly how the ENIAC worked.
The system is not really organized in such a way as would be suited
to a usual end=user installation.
Generally, it is assumed that the user is generally working in the
main directory called eniac-simulator.
The key subdirectories are:
images: This directory contains images that are
used by the TCL/Tk-based visualization support.
obj: The files in this directory are an OBJ format
3D model of the ENIAC with photographic texture.
It is used by several of the visulization add-ons.
programs: ENIAC configuration files are kept in this
directory.
Typically, they have a .e extension, but that's not required.
src: This directory contains the source code for
the core simulator.
The compiled binary generally stays in that directory as well.
vis: This is where the code (and typically binaries)
for the various visualization programs are located.
The core simulator is written in Go and can be compiled for nearly any environment. It has a simple command-line user interface (with the option of running any of several graphical visualizations).
The files listed below are part of an ENIAC simulator that I've recently been developing.
Here is a screen shot of the ENIAC simulator running as it computes prime numbers. The image links to a higher resolution version.
And here's another image looking head-on at the first eight units as it computes a table of squares:
and a couple more showing the ENIAC simulator running on the PocketCHIP ARM machine with a 480x272 display:

To run the ENIAC simulator, you'll need the binary executable appropriate
to your platform.
You'll almost certainly want the example ENIAC programs as well.
If you want to run with the GUI, then you'll need the images as well
as the TCL/Tk package installed and the program wish in your path.
The source code is entirely optional.
It's pretty rough at the moment, but if you want to download it and
take a look, you're welcome to.
eniac
and that the file is in your path.
If you're in a UNIX environment and eniac is in the
current directory but . is not in your path, then run
it with ./eniac instead.
When running eniac, there are several command-line
parameters that can be given.
If the simulator is run with the -g option, it runs
without the GUI.
The -w option is used to specify the size of the
rendered image used for the GUI.
The available sizes are 480, 720, 1020, 1280, 1360, 1600, 1800, and 1900.
By default, the simulator picks the largest size that will completely
fit on the screen.
Finally, you can specify the name of a file to be read at startup.
Such files are normally named with the .e extension
and contain commands to specify the wiring and switch settings
for a particular ENIAC program.
By way of example, to run the prime number generator from which the screen shot was taken, you can issue the command:
eniac -w 1900 sieve.eClicking on the button labeled
INIT in the GUI will
send the initiating pulse from the initiating unit that begins
the computation running.
The text box in the lower right hand corner of the GUI shows the
punched cards that are generated by the ENIAC as output.
The INIT button is part of a hand-held control unit.
The full set of controls on that unit include:
Co, 1P, 1A: These
buttons select the
Continuous (normal operating mode),
1 Pulse (single cycle unit pulse for each press of the PULSE
button), and 1 Add (running
one addition time for each press of the PULSE button)
modes, respectively.
The current mode is shown in the upper left of the control box.
CLEAR: When this button is pressed, a clear signal
is sent to all of the operating units.
For most units, this terminates the current program, and the values in
accumulators are all set to 0.
READ: Send a starting pulse to the punched card
reader in the constant transmitter unit.
The program output pulse from the constant transmitter then triggers
the remainder of the computation.
INIT: Send a pulse out the initiating unit output
to start the computation.
PULSE: Initiate a single step in the 1 Add and
1 Pulse modes.
There are two additional buttons to the left of the control box.
The button labeled RESET has the effect of removing
all of the control and data patch cables and the resetting of all
control switches to their initial positions.
Pressing the LOAD CONF button brings up
a pop-up menu listing the available configurations/programs that
can be run on the simulator.
Selecting one from the menu, loads the selected set of data and control
patch cables and switch settings onto the machine.
The configuration system is designed to allow multiple configurations
to be read and layered.
Therefore, if you want to start running a new program, you should
click the RESET button before loading a new
configuration.
The original ENIAC included a portable control station that replicated a number of the control buttons and switches in a form that could be carried around the machine. This picture is the only one I've found that shows any detail of the original unit:
And here is a 3D printed approximate replica of it:
The OpenSCAD and STL files can be found on Thingiverse.
The main planned documentation is still yet to be written, but here are some bits that exist so far.
gzip
compressed tar files.