The Bergamot pipeilne implementation uses a very simple design wherein only one stage operates per cycle. The core (see: pipelines/bergamot/implementation/simplecore.py) orchestrates all operations in the execution of each instruction; to wit:
- fetch PC from the register file (see: pipelines/bergamot/implementation/regfile.py)
- fetch instruction bytes from main memory (see: components/simplemainmem/mainmem.py)
- decode instruction from raw bytes (see: pipelines/bergamot/implementation/decode.py)
- fetch source operands from register file
- execute instruction (see: pipelines/bergamot/implementation/execute.py)
- write back destination register
- update PC
None of these operations overlap (meaning that this implementation, arguably, does not model a proper pipeline). But this very simple design was instrumental in the early stages of the toolkit development, when instruction implementations were being coded and debugged.