sentinel-cpu 0.1.0b2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. sentinel_cpu-0.1.0b2/.cargo/config.toml +8 -0
  2. sentinel_cpu-0.1.0b2/.gitignore +47 -0
  3. sentinel_cpu-0.1.0b2/.gitmodules +12 -0
  4. sentinel_cpu-0.1.0b2/.readthedocs.yaml +42 -0
  5. sentinel_cpu-0.1.0b2/CHANGELOG.md +503 -0
  6. sentinel_cpu-0.1.0b2/Cargo.lock +209 -0
  7. sentinel_cpu-0.1.0b2/Cargo.toml +19 -0
  8. sentinel_cpu-0.1.0b2/LICENSE.md +24 -0
  9. sentinel_cpu-0.1.0b2/PKG-INFO +176 -0
  10. sentinel_cpu-0.1.0b2/README.md +164 -0
  11. sentinel_cpu-0.1.0b2/ci/gen_release_notes.py +91 -0
  12. sentinel_cpu-0.1.0b2/ci/oss-cad-suite-version +1 -0
  13. sentinel_cpu-0.1.0b2/ci/release_notes.md.in +24 -0
  14. sentinel_cpu-0.1.0b2/ci/testpypi_version.py +26 -0
  15. sentinel_cpu-0.1.0b2/cliff.toml +114 -0
  16. sentinel_cpu-0.1.0b2/doc/.gitignore +6 -0
  17. sentinel_cpu-0.1.0b2/doc/Transparent.png +0 -0
  18. sentinel_cpu-0.1.0b2/doc/White Background Ver.png +0 -0
  19. sentinel_cpu-0.1.0b2/doc/_static/blockdiag.png +0 -0
  20. sentinel_cpu-0.1.0b2/doc/blockdiag.odg +0 -0
  21. sentinel_cpu-0.1.0b2/doc/blockdiag.png +0 -0
  22. sentinel_cpu-0.1.0b2/doc/changes.md +2 -0
  23. sentinel_cpu-0.1.0b2/doc/conf.py +150 -0
  24. sentinel_cpu-0.1.0b2/doc/development/guidelines.md +99 -0
  25. sentinel_cpu-0.1.0b2/doc/development/internals.md +366 -0
  26. sentinel_cpu-0.1.0b2/doc/development/microcode.md +217 -0
  27. sentinel_cpu-0.1.0b2/doc/development/overview.md +186 -0
  28. sentinel_cpu-0.1.0b2/doc/development/support-code.md +48 -0
  29. sentinel_cpu-0.1.0b2/doc/development/testing.md +554 -0
  30. sentinel_cpu-0.1.0b2/doc/index.md +49 -0
  31. sentinel_cpu-0.1.0b2/doc/todo.md +8 -0
  32. sentinel_cpu-0.1.0b2/doc/usage/installation.md +241 -0
  33. sentinel_cpu-0.1.0b2/doc/usage/quickstart.md +141 -0
  34. sentinel_cpu-0.1.0b2/doc/usage/reference.md +171 -0
  35. sentinel_cpu-0.1.0b2/dodo.py +750 -0
  36. sentinel_cpu-0.1.0b2/examples/attosoc.py +1152 -0
  37. sentinel_cpu-0.1.0b2/pdm.lock +1836 -0
  38. sentinel_cpu-0.1.0b2/pyproject.toml +339 -0
  39. sentinel_cpu-0.1.0b2/sentinel-rt/Cargo.toml +28 -0
  40. sentinel_cpu-0.1.0b2/sentinel-rt/examples/attosoc.rs +410 -0
  41. sentinel_cpu-0.1.0b2/sentinel-rt/examples/device.x +14 -0
  42. sentinel_cpu-0.1.0b2/sentinel-rt/src/lib.rs +6 -0
  43. sentinel_cpu-0.1.0b2/src/sentinel_cpu/__init__.py +13 -0
  44. sentinel_cpu-0.1.0b2/src/sentinel_cpu/align.py +241 -0
  45. sentinel_cpu-0.1.0b2/src/sentinel_cpu/alu.py +392 -0
  46. sentinel_cpu-0.1.0b2/src/sentinel_cpu/control.py +747 -0
  47. sentinel_cpu-0.1.0b2/src/sentinel_cpu/csr.py +379 -0
  48. sentinel_cpu-0.1.0b2/src/sentinel_cpu/datapath.py +905 -0
  49. sentinel_cpu-0.1.0b2/src/sentinel_cpu/decode.py +705 -0
  50. sentinel_cpu-0.1.0b2/src/sentinel_cpu/exception.py +266 -0
  51. sentinel_cpu-0.1.0b2/src/sentinel_cpu/formal.py +602 -0
  52. sentinel_cpu-0.1.0b2/src/sentinel_cpu/gen.py +171 -0
  53. sentinel_cpu-0.1.0b2/src/sentinel_cpu/insn.py +240 -0
  54. sentinel_cpu-0.1.0b2/src/sentinel_cpu/microcode.asm +540 -0
  55. sentinel_cpu-0.1.0b2/src/sentinel_cpu/top.py +458 -0
  56. sentinel_cpu-0.1.0b2/src/sentinel_cpu/ucodefields.py +467 -0
  57. sentinel_cpu-0.1.0b2/src/sentinel_cpu/ucoderom.py +319 -0
  58. sentinel_cpu-0.1.0b2/src/sentinel_cpu/version.txt +1 -0
  59. sentinel_cpu-0.1.0b2/tests/__init__.py +0 -0
  60. sentinel_cpu-0.1.0b2/tests/conftest.py +135 -0
  61. sentinel_cpu-0.1.0b2/tests/formal/README.md +14 -0
  62. sentinel_cpu-0.1.0b2/tests/formal/checks.cfg +143 -0
  63. sentinel_cpu-0.1.0b2/tests/formal/disasm.py +60 -0
  64. sentinel_cpu-0.1.0b2/tests/formal/wrapper.sv +155 -0
  65. sentinel_cpu-0.1.0b2/tests/riscof/.gitignore +3 -0
  66. sentinel_cpu-0.1.0b2/tests/riscof/README.md +21 -0
  67. sentinel_cpu-0.1.0b2/tests/riscof/bin/riscv_sim_RV32.gz +0 -0
  68. sentinel_cpu-0.1.0b2/tests/riscof/config.ini +21 -0
  69. sentinel_cpu-0.1.0b2/tests/riscof/sail_cSim/__init__.py +2 -0
  70. sentinel_cpu-0.1.0b2/tests/riscof/sail_cSim/env/link.ld +18 -0
  71. sentinel_cpu-0.1.0b2/tests/riscof/sail_cSim/env/model_test.h +55 -0
  72. sentinel_cpu-0.1.0b2/tests/riscof/sail_cSim/riscof_sail_cSim.py +150 -0
  73. sentinel_cpu-0.1.0b2/tests/riscof/sentinel/env/link.ld +20 -0
  74. sentinel_cpu-0.1.0b2/tests/riscof/sentinel/env/model_test.h +65 -0
  75. sentinel_cpu-0.1.0b2/tests/riscof/sentinel/riscof_sentinel.py +271 -0
  76. sentinel_cpu-0.1.0b2/tests/riscof/sentinel/sentinel_isa.yaml +28 -0
  77. sentinel_cpu-0.1.0b2/tests/riscof/sentinel/sentinel_platform.yaml +8 -0
  78. sentinel_cpu-0.1.0b2/tests/sim/conftest.py +71 -0
  79. sentinel_cpu-0.1.0b2/tests/sim/test_soc.py +81 -0
  80. sentinel_cpu-0.1.0b2/tests/sim/test_top.py +701 -0
  81. sentinel_cpu-0.1.0b2/tests/sim/test_ucode.py +61 -0
  82. sentinel_cpu-0.1.0b2/tests/sim/test_witness.py +204 -0
  83. sentinel_cpu-0.1.0b2/tests/sim/witness/csrrc_bad_rd.yw +65 -0
  84. sentinel_cpu-0.1.0b2/tests/upstream/README.md +14 -0
  85. sentinel_cpu-0.1.0b2/tests/upstream/binaries/.gitignore +1 -0
  86. sentinel_cpu-0.1.0b2/tests/upstream/binaries/add +0 -0
  87. sentinel_cpu-0.1.0b2/tests/upstream/binaries/add.dump +505 -0
  88. sentinel_cpu-0.1.0b2/tests/upstream/binaries/addi +0 -0
  89. sentinel_cpu-0.1.0b2/tests/upstream/binaries/addi.dump +309 -0
  90. sentinel_cpu-0.1.0b2/tests/upstream/binaries/and +0 -0
  91. sentinel_cpu-0.1.0b2/tests/upstream/binaries/and.dump +461 -0
  92. sentinel_cpu-0.1.0b2/tests/upstream/binaries/andi +0 -0
  93. sentinel_cpu-0.1.0b2/tests/upstream/binaries/andi.dump +241 -0
  94. sentinel_cpu-0.1.0b2/tests/upstream/binaries/auipc +0 -0
  95. sentinel_cpu-0.1.0b2/tests/upstream/binaries/auipc.dump +118 -0
  96. sentinel_cpu-0.1.0b2/tests/upstream/binaries/beq +0 -0
  97. sentinel_cpu-0.1.0b2/tests/upstream/binaries/beq.dump +319 -0
  98. sentinel_cpu-0.1.0b2/tests/upstream/binaries/bge +0 -0
  99. sentinel_cpu-0.1.0b2/tests/upstream/binaries/bge.dump +365 -0
  100. sentinel_cpu-0.1.0b2/tests/upstream/binaries/bgeu +0 -0
  101. sentinel_cpu-0.1.0b2/tests/upstream/binaries/bgeu.dump +384 -0
  102. sentinel_cpu-0.1.0b2/tests/upstream/binaries/blt +0 -0
  103. sentinel_cpu-0.1.0b2/tests/upstream/binaries/blt.dump +319 -0
  104. sentinel_cpu-0.1.0b2/tests/upstream/binaries/bltu +0 -0
  105. sentinel_cpu-0.1.0b2/tests/upstream/binaries/bltu.dump +338 -0
  106. sentinel_cpu-0.1.0b2/tests/upstream/binaries/bne +0 -0
  107. sentinel_cpu-0.1.0b2/tests/upstream/binaries/bne.dump +318 -0
  108. sentinel_cpu-0.1.0b2/tests/upstream/binaries/csr +0 -0
  109. sentinel_cpu-0.1.0b2/tests/upstream/binaries/csr.dump +297 -0
  110. sentinel_cpu-0.1.0b2/tests/upstream/binaries/fence_i +0 -0
  111. sentinel_cpu-0.1.0b2/tests/upstream/binaries/fence_i.dump +162 -0
  112. sentinel_cpu-0.1.0b2/tests/upstream/binaries/illegal +0 -0
  113. sentinel_cpu-0.1.0b2/tests/upstream/binaries/illegal.dump +346 -0
  114. sentinel_cpu-0.1.0b2/tests/upstream/binaries/jal +0 -0
  115. sentinel_cpu-0.1.0b2/tests/upstream/binaries/jal.dump +154 -0
  116. sentinel_cpu-0.1.0b2/tests/upstream/binaries/jalr +0 -0
  117. sentinel_cpu-0.1.0b2/tests/upstream/binaries/jalr.dump +190 -0
  118. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lb +0 -0
  119. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lb.dump +306 -0
  120. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lbu +0 -0
  121. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lbu.dump +306 -0
  122. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lh +0 -0
  123. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lh-misaligned +0 -0
  124. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lh-misaligned.dump +156 -0
  125. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lh.dump +323 -0
  126. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lhu +0 -0
  127. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lhu.dump +316 -0
  128. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lui +0 -0
  129. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lui.dump +153 -0
  130. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lw +0 -0
  131. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lw-misaligned +0 -0
  132. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lw-misaligned.dump +167 -0
  133. sentinel_cpu-0.1.0b2/tests/upstream/binaries/lw.dump +311 -0
  134. sentinel_cpu-0.1.0b2/tests/upstream/binaries/ma_addr +0 -0
  135. sentinel_cpu-0.1.0b2/tests/upstream/binaries/ma_addr.dump +354 -0
  136. sentinel_cpu-0.1.0b2/tests/upstream/binaries/ma_data +0 -0
  137. sentinel_cpu-0.1.0b2/tests/upstream/binaries/ma_data.dump +631 -0
  138. sentinel_cpu-0.1.0b2/tests/upstream/binaries/ma_fetch +0 -0
  139. sentinel_cpu-0.1.0b2/tests/upstream/binaries/ma_fetch.dump +232 -0
  140. sentinel_cpu-0.1.0b2/tests/upstream/binaries/mcsr +0 -0
  141. sentinel_cpu-0.1.0b2/tests/upstream/binaries/mcsr.dump +120 -0
  142. sentinel_cpu-0.1.0b2/tests/upstream/binaries/or +0 -0
  143. sentinel_cpu-0.1.0b2/tests/upstream/binaries/or.dump +458 -0
  144. sentinel_cpu-0.1.0b2/tests/upstream/binaries/ori +0 -0
  145. sentinel_cpu-0.1.0b2/tests/upstream/binaries/ori.dump +266 -0
  146. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sb +0 -0
  147. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sb.dump +449 -0
  148. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sbreak +0 -0
  149. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sbreak.dump +122 -0
  150. sentinel_cpu-0.1.0b2/tests/upstream/binaries/scall +0 -0
  151. sentinel_cpu-0.1.0b2/tests/upstream/binaries/scall.dump +139 -0
  152. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sh +0 -0
  153. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sh-misaligned +0 -0
  154. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sh-misaligned.dump +178 -0
  155. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sh.dump +482 -0
  156. sentinel_cpu-0.1.0b2/tests/upstream/binaries/shamt +0 -0
  157. sentinel_cpu-0.1.0b2/tests/upstream/binaries/shamt.dump +122 -0
  158. sentinel_cpu-0.1.0b2/tests/upstream/binaries/simple +0 -0
  159. sentinel_cpu-0.1.0b2/tests/upstream/binaries/simple.dump +106 -0
  160. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sll +0 -0
  161. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sll.dump +549 -0
  162. sentinel_cpu-0.1.0b2/tests/upstream/binaries/slli +0 -0
  163. sentinel_cpu-0.1.0b2/tests/upstream/binaries/slli.dump +310 -0
  164. sentinel_cpu-0.1.0b2/tests/upstream/binaries/slt +0 -0
  165. sentinel_cpu-0.1.0b2/tests/upstream/binaries/slt.dump +479 -0
  166. sentinel_cpu-0.1.0b2/tests/upstream/binaries/slti +0 -0
  167. sentinel_cpu-0.1.0b2/tests/upstream/binaries/slti.dump +314 -0
  168. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sltiu +0 -0
  169. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sltiu.dump +314 -0
  170. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sltu +0 -0
  171. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sltu.dump +479 -0
  172. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sra +0 -0
  173. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sra.dump +564 -0
  174. sentinel_cpu-0.1.0b2/tests/upstream/binaries/srai +0 -0
  175. sentinel_cpu-0.1.0b2/tests/upstream/binaries/srai.dump +329 -0
  176. sentinel_cpu-0.1.0b2/tests/upstream/binaries/srl +0 -0
  177. sentinel_cpu-0.1.0b2/tests/upstream/binaries/srl.dump +538 -0
  178. sentinel_cpu-0.1.0b2/tests/upstream/binaries/srli +0 -0
  179. sentinel_cpu-0.1.0b2/tests/upstream/binaries/srli.dump +335 -0
  180. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sub +0 -0
  181. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sub.dump +479 -0
  182. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sw +0 -0
  183. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sw-misaligned +0 -0
  184. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sw-misaligned.dump +184 -0
  185. sentinel_cpu-0.1.0b2/tests/upstream/binaries/sw.dump +479 -0
  186. sentinel_cpu-0.1.0b2/tests/upstream/binaries/xor +0 -0
  187. sentinel_cpu-0.1.0b2/tests/upstream/binaries/xor.dump +459 -0
  188. sentinel_cpu-0.1.0b2/tests/upstream/binaries/xori +0 -0
  189. sentinel_cpu-0.1.0b2/tests/upstream/binaries/xori.dump +264 -0
  190. sentinel_cpu-0.1.0b2/tests/upstream/binaries/zicntr +0 -0
  191. sentinel_cpu-0.1.0b2/tests/upstream/binaries/zicntr.dump +228 -0
  192. sentinel_cpu-0.1.0b2/tests/upstream/link.ld +17 -0
  193. sentinel_cpu-0.1.0b2/tests/upstream/riscv_test.h +264 -0
  194. sentinel_cpu-0.1.0b2/tests/upstream/test_upstream.py +130 -0
@@ -0,0 +1,8 @@
1
+ [build]
2
+ target="riscv32i-unknown-none-elf"
3
+
4
+ [target.riscv32i-unknown-none-elf]
5
+ rustflags = [
6
+ "-C", "link-arg=--threads=1", # --threads=1 fixes Windows issue: https://github.com/rust-lang/rust/issues/115985
7
+ "-C", "link-arg=-Tsentinel-rt/examples/device.x"
8
+ ]
@@ -0,0 +1,47 @@
1
+ # Python
2
+ __pycache__/
3
+ *.egg-info
4
+ /dist
5
+
6
+ # pdm
7
+ /.pdm-plugins
8
+ /.pdm-python
9
+ /.python-version
10
+ /.venv
11
+ # Part of dynamic version generation.
12
+ /src/sentinel_cpu/version.txt
13
+ # Release note generation.
14
+ /release_notes.md
15
+
16
+ # pytest
17
+ /.pytest_cache
18
+
19
+ # Amaranth
20
+ /build*
21
+
22
+ # GtkWave
23
+ *.vcd
24
+ *.gtkw
25
+
26
+ # Doit
27
+ .doit.db*
28
+
29
+ # logluts
30
+ /LUTs.csv
31
+
32
+ # m5meta
33
+ *.asm*.fdef
34
+ *.asm*.hex
35
+
36
+ # Yosys
37
+ /abc.history
38
+
39
+ # RVFormal disassembled counterexamples
40
+ *.s
41
+
42
+ # YoWASP setup
43
+ .env.toolchain
44
+
45
+ # Added by cargo
46
+
47
+ /target
@@ -0,0 +1,12 @@
1
+ [submodule "tests/upstream/riscv-tests"]
2
+ path = tests/upstream/riscv-tests
3
+ url = https://github.com/riscv/riscv-tests
4
+ [submodule "tests/formal/riscv-formal"]
5
+ path = tests/formal/riscv-formal
6
+ url = https://github.com/YosysHQ/riscv-formal
7
+ [submodule "tests/riscof/sail-riscv"]
8
+ path = tests/riscof/sail-riscv
9
+ url = https://github.com/riscv/sail-riscv.git
10
+ [submodule "tests/riscof/riscv-arch-test"]
11
+ path = tests/riscof/riscv-arch-test
12
+ url = https://github.com/riscv-non-isa/riscv-arch-test
@@ -0,0 +1,42 @@
1
+ # Read the Docs configuration file for Sphinx projects
2
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
3
+
4
+ # Required
5
+ version: 2
6
+
7
+ # Set the OS, Python version and other tools you might need
8
+ build:
9
+ os: ubuntu-22.04
10
+ tools:
11
+ python: "3.12"
12
+ # You can also specify other tool versions:
13
+ # nodejs: "20"
14
+ # rust: "1.70"
15
+ # golang: "1.20"
16
+ jobs:
17
+ post_checkout:
18
+ # Reconstruct tags.
19
+ - git fetch --unshallow --tags
20
+ post_create_environment:
21
+ # Install PDM
22
+ - pip install -U pdm
23
+ post_install:
24
+ # See:
25
+ # * https://github.com/readthedocs/readthedocs.org/pull/11152/
26
+ # * https://github.com/pdm-project/pdm/pull/2736/files#diff-03efc769b870804394632e45d7885272b44c16939517fb31c9d7c614d2ffae57
27
+ # * and https://docs.readthedocs.io/en/stable/build-customization.html#install-dependencies-with-poetry
28
+ # This replaces requirements.txt specified in: https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
29
+ - VIRTUAL_ENV=$READTHEDOCS_VIRTUALENV_PATH pdm install -G doc -G examples
30
+
31
+ # Build documentation in the "docs/" directory with Sphinx
32
+ sphinx:
33
+ configuration: doc/conf.py
34
+ # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs
35
+ # builder: "dirhtml"
36
+ # Fail on all warnings to avoid broken references
37
+ # fail_on_warning: true
38
+
39
+ # Optionally build your docs in additional formats such as PDF and ePub
40
+ # formats:
41
+ # - pdf
42
+ # - epub
@@ -0,0 +1,503 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ _Note that the Python ecosystem itself [doesn't really](https://iscinumpy.dev/post/bound-version-constraints/)
9
+ adhere to Semantic Versioning._ Dependency updates are automatically managed
10
+ with [Renovate Bot](https://www.mend.io/renovate/) on Sentinel's two branches
11
+ to detect dependency breakage that warrants a new release/yank.
12
+
13
+ The Sentinel repository has two active branches: `main` and `next`. Releases
14
+ and patches live on `main`, and development takes place on `next`. `next` is
15
+ developed against the upstream/git versions of [Amaranth] and associated
16
+ packages. These include, but are not limited to:
17
+
18
+ * [`amaranth`]
19
+ * [`amaranth-boards`]
20
+ * [`amaranth-soc`]
21
+ * [`amaranth-stdio`]
22
+
23
+ If necessary, patches from `main` can be forward-ported to `next`, and commits
24
+ from `next` and be backported to `main` for a point-release. _When possible_,
25
+ releases are made against Amaranth packages on [PyPI](https://pypi.org/), even
26
+ though development is done against the Amaranth git repos.
27
+
28
+
29
+ ## [Unreleased]
30
+
31
+ ## [0.1.0-beta.2] - 2026-05-09
32
+
33
+ _This is the first version of Sentinel with the import name `sentinel_cpu`_,
34
+ as well as the first version which is published to PyPI. Codeberg now provides
35
+ CI via its [Forgejo Actions](https://codeberg.org/cr1901/sentinel/actions)
36
+ [runners](https://codeberg.org/actions/meta). _No functional change to Sentinel
37
+ is intended compared to [0.1.0-beta.1]._
38
+
39
+ The large diff for this release is a bit misleading. The only changes to the
40
+ Python source files and docs are to rename `sentinel` to `sentinel_cpu`
41
+ as appropriate, and fixing line lengths as a result of said name change. CI
42
+ workflow files had to be split and optimized due to Codeberg limitations
43
+ (particularly the 10 minute runner limit as of 5-8-2026), but the tests
44
+ themselves are the same as those that were run on Github Actions. Additionally,
45
+ CI now runs new build, publish, and release steps.
46
+
47
+ ### Added
48
+ - `asset`, `build`, publish (`publish.yml`) and `release` jobs for CI.
49
+ - `assets` generates release notes and Verilog for Forgejo [releases](https://codeberg.org/cr1901/sentinel/releases).
50
+ - `build` creates the Python package (wheel/sdist).
51
+ - `publish.yml` uploads the package to [TestPyPI](https://test.pypi.org/project/sentinel-cpu/)
52
+ or [PyPI](https://pypi.org/project/sentinel-cpu/), for releases.
53
+ - `release` takes the outputs of the `assets` step and publishes them to
54
+ Forgejo [releases](https://codeberg.org/cr1901/sentinel/releases).
55
+ - For now, the `release` step also uploads the wheel/sdist from the `build`
56
+ step.
57
+ - Use [`pytest-xdist`](https://github.com/pytest-dev/pytest-xdist) to run `ci-basic`
58
+ tests in parallel.
59
+ - `list_sby_status` supports partial runs when invoked with `doit -s` (for use with CI).
60
+ - Add CONTRIBUTING.md, to make clear that AI contributions are not allowed.
61
+
62
+ ### Changed
63
+ - The [import package](https://packaging.python.org/en/latest/discussions/distribution-package-vs-import-package/#what-s-an-import-package)
64
+ name of Sentinel has changed from `sentinel` to `sentinel_cpu`.
65
+ - `ci-quickstart` no longer compiles the Rust firmware/requires Rust- it was
66
+ probably overkill.
67
+ - Allow caching of `pdm` and `yowasp` for `ci-quickstart` job to ease runner usage.
68
+ - I called this `ci-minimal` in the commit... oops!
69
+ - Split `ci-basic` lint and doc building steps into their own jobs.
70
+ - Python lint, Rust lint, and doc building are separate jobs so they can run
71
+ reliably on `codeberg-tiny`.
72
+ - _They are now all enabled for each CI run, not just releases._
73
+ - Move RISC-V Formal (`ci-rvformal`) and RISCOF (`ci-riscof`) jobs into their
74
+ own [reusable workflows](https://forgejo.org/docs/next/user/actions/reference/#onworkflow_call).
75
+ - Because there is currently (5-8-2026) a 10 minute runner limit on Codeberg,
76
+ split the jobs into < 10 minute chunks using a
77
+ [matrix](https://forgejo.org/docs/next/user/actions/reference/#jobsjob_idstrategymatrix).
78
+ - In contrast to what I suggest in general, _running split jobs invokes
79
+ `doit` tasks directly instead of using `pdm`_; the equivalent `pdm`
80
+ scripts assume you run the entire CI flow in one command. This should be
81
+ fixed once runners with longer limits on Codeberg are available.
82
+ - Both `ci-rvformal` and `ci-riscof` can [manually](https://forgejo.org/docs/next/user/actions/reference/#onworkflow_dispatch)
83
+ be triggered. `ci-rvformal` also runs weekly via a cron script.
84
+ - Use [`setup-pdm`](https://github.com/pdm-project/setup-pdm) exclusively to
85
+ setup Python environments in CI; it transitively calls [`setup-python`](https://code.forgejo.org/actions/setup-python)
86
+ anyway.
87
+ - Use a Forgejo-compatible [fork](https://codeberg.org/prjunnamed/setup-rust-toolchain)
88
+ of `setup-rust-toolchain` to install Rust.
89
+ - Start transitioning away from requiring RISC-V GCC [Ubuntu package](https://launchpad.net/ubuntu/+source/gcc-riscv64-unknown-elf)
90
+ for CI; the install time can be rather variable for the limited CI time.
91
+ - We've been using LLVM to link Rust code in `ci-basic` for a while now.
92
+ In fact, requiring RISC-V GCC in `ci-basic` may have always been an oversight.
93
+ - For `ci-rvformal`, use [tinyrv](https://github.com/s-holst/tinyrv) instead
94
+ of `riscv64-unknown-elf-objdump` to generate disassemblies for traces.
95
+ - `ci-riscof` still requires/hardcode `gcc-riscv64-unknown-elf`, but RISCOF is
96
+ [deprecated](https://github.com/riscv-software-src/riscof/commit/90ebd1bf48bc7928a5f6a7b0b4993f9fbc944f47).
97
+ So that usage may be removed eventually.
98
+
99
+ ### Fixed
100
+ - Specify Amaranth 0.5.8 as minimum version in `pyproject.toml`.
101
+ - Use unique keys for each CI job for `pdm` caching to avoid thrashing.
102
+ - Update `sent_latest_tag`, which in turn fixes the outdated Sentinel version
103
+ that was dynamically substituted inside [last release's][0.1.0-beta.1] docs.
104
+ - `list_sby_status` correctly handles an `ERROR` return code from `sby`.
105
+ - Specify that `doc` and `examples` groups need to be installed for building
106
+ docs in `conf.py` `PackageNotFoundError` handler. Also do a minimal check
107
+ for the `examples` group.
108
+
109
+
110
+ ## [0.1.0-beta.1] - 2026-04-22
111
+
112
+ _This is the last version with the import name `sentinel`. Future releases
113
+ will be importable under `sentinel_cpu`. See [#88](https://codeberg.org/cr1901/sentinel/issues/88)
114
+ for more information._
115
+
116
+ [Amaranth 0.5.8](https://github.com/amaranth-lang/amaranth/tree/v0.5.x) is now
117
+ the minimum required version to use Sentinel, either directly from this repo
118
+ or as a dependency. Sentinel no longer requires [`amaranth-soc`], so that
119
+ future releases can be uploaded to PyPI. This will last until `amaranth-soc`
120
+ gets a PyPI release. If `amaranth-soc` is available in your Python environment,
121
+ Sentinel will use it.
122
+
123
+ Due to [issues](https://mrshu.github.io/github-statuses/) with Github, I've
124
+ decided to migrate the repo to [Codeberg](https://codeberg.org/cr1901/sentinel).
125
+ Although functional, I did not intend to cut a release in this state. However,
126
+ I've accumulated a number of changes since the last release, so I might as well
127
+ start with a fresh slate for Codeberg. No Codeberg-specific changes are in this
128
+ release, aside from updating doc URLs.
129
+
130
+ Minimal Forgejo CI is functional in a separate branch. I'm holding off merging
131
+ it until the next release as part of Codeberg-specific changes; this will make
132
+ writing the CHANGELOG and diffing easier for me. I've manually ensured all test
133
+ suites pass before releasing. _References to CI in this release refer to
134
+ [Github Actions](https://github.com/cr1901/sentinel/actions) CI._
135
+
136
+ ### Added
137
+ - Parallel support in RISCOF test suite.
138
+ - Run the relevant privileged tests of RISCOF test suite. Sentinel passes!
139
+ - This required sending [a patch](https://github.com/riscv-non-isa/riscv-arch-test/pull/599)
140
+ to upstream RISCOF!
141
+ - Add RISC-V Formal tests for experimenting with how IRQs affect CSRs (via
142
+ the `irq` [group](https://yosyshq.readthedocs.io/projects/riscv-formal/en/latest/procedure.html#groups)).
143
+ - Presently, these are not run by default, as from RISC-V Formal's doesn't
144
+ really handle interrupts; interrupts are not exceptions, and the `PC`
145
+ checks are too strict for non-exceptions.
146
+ - Add pre-generated Verilog for all tagged versions via Releases.
147
+ - Skip resource-intensive CI if only documentation was changed for a commit.
148
+ - Add turnkey docs for programmers who want to simply use Sentinel without
149
+ exploring the source code.
150
+
151
+ ### Changed
152
+ - Update all test submodules to most recent commits as of mid Janurary 2025.
153
+ Also recompile SAIL.
154
+ - Mostly symbolic, as the submodules didn't really change in a way that
155
+ affect Sentinel, save for the aforementioned RISCOF patch.
156
+ - Microcode improvements:
157
+ - All shift ops have latency reduced by 1 cycle.
158
+ - Branches are predicted not taken, and branches taken are predicted to
159
+ have no exceptions. End result is latency and inverse-throughput of branch
160
+ instructions decrease both by 1 CPI.
161
+ - Predict that exceptions don't occur for JAL/JALR. Latency decreases by 2
162
+ CPI, inverse-throughput decreases by 1 CPI for JAL/JALR.
163
+ - Rename `CONDTEST_ALU_CMP_FAILED` to the more-general `CONDTEST_ALU_ZERO`.
164
+ We can always bring it back later if needed.
165
+ - _Attempt_ to swap out AttoSoC peripherals with those available in
166
+ `amaranth-soc` or `amaranth-stdio`.
167
+ - Swapped peripherals include: `WishboneSRAM`
168
+ - No functional changes, just better for the demo to use the Amaranth
169
+ support packages when possible to facilitate good practice.
170
+ - Introduction of `WishboneSRAM` requires ~150 extra LUTs, so **this change
171
+ was reverted** until deciding what to do with iCEStick.
172
+ - Optimize `OP_IMM` decoding (resource usage) using [z3](https://github.com/Z3Prover/z3).
173
+ - Generally refactor `AttoSoC` to look nicer as part of fixing the inline
174
+ `objcopy` implementation.
175
+ - Future work on examples may split out common functionality in `AttoSoC`
176
+ into multiple files.
177
+ - When building a [source dist](https://packaging.python.org/en/latest/specifications/source-distribution-format/),
178
+ try to match the contents of tarballs/zip files generated by Github, Codeberg,
179
+ or other forges.
180
+ - I _believe_ forge tarballs/zips (ie. the files generated by default for
181
+ tags and releases) are generated from a shallow clone, but I don't remember
182
+ for sure.
183
+ - The idea is I want to save server space, save time generating the sdists, and
184
+ to minimize confusion from having both sdists and forge source tarballs/zips.
185
+ However, _this is a best-effort basis!_ E.g. an sdist will have access to
186
+ version info that a plain-old tarball/zip does not.
187
+ - Polyfill [`amaranth-soc`] usage (e.g. `wishbone.Signature`) using
188
+ [`amaranth`] alone.
189
+ - `sentinel.formal.FormalTop` now gets its signature by inspecting
190
+ `sentinel.top.Top`'s signature.
191
+ - `sentinel.gen.generate` has been renamed to `sentinel.gen.cli`, as part of
192
+ rewriting the whole `sentinel.gen` module.
193
+ - Point all [git+]https://github.com/cr1901/sentinel/ URLs in docs to
194
+ [git+]https://codeberg.org/cr1901/sentinel/.
195
+
196
+ ### Fixed
197
+ - Fix a microcode typo that caused the `CSRRCI` instruction to be clear bits
198
+ when it shouldn't have.
199
+ - Add handwritten test case to CI, since upstream and RISCOF don't test
200
+ interrupts, and RISC-V Formal makes assumptions that don't work well with
201
+ interrupts.
202
+ - Open [m5meta issue](https://github.com/brouhaha/m5meta/issues/3), as future
203
+ typos can be caught at assemble-time.
204
+ - Improve inline `objcopy` implementation in AttoSoC example to work for ELF
205
+ files with more complex layouts.
206
+ - This fix is a precaution; the `attosoc` Rust firmware worked just with the
207
+ old implementation which assumes [loadable segments](https://www.sco.com/developers/gabi/latest/ch5.pheader.html)
208
+ are all adjacent.
209
+ - Increase the UART speed to reduce bit timer width; demo bitstream fits into
210
+ 1280 LUTs again!
211
+ - Documentation now makes clear that MIP.MEIP bit is read-only.
212
+ - Change `checks.cfg` paths so that paths parse correctly when running RISC-V
213
+ Formal with a Python compiled by MSVC.
214
+ - Pytest tests now ignore RISCOF dirs when RISCOF is checked out.
215
+
216
+ ### Removed
217
+ - The constant `-1` is no longer produced by the constant generator; it can
218
+ easily be synthesized by subtracting `1` on the ALU's B input from `0` on
219
+ the ALU's A input.
220
+
221
+
222
+ ## [0.1.0-beta] - 2025-01-12
223
+
224
+ [Amaranth 0.5.4](https://github.com/amaranth-lang/amaranth/tree/v0.5.x) is now
225
+ the minimum required version to use Sentinel, either directly from this repo
226
+ or as a dependency.
227
+
228
+ Sentinel still tracks upstream [`amaranth-soc`]. For the time being, use Sentinel
229
+ with caution outside of environments without lockfiles, and prefer installing
230
+ Sentinel [within a PDM environment](https://sentinel-cpu.readthedocs.io/en/latest/usage/installation.html#in-a-pdm-project):
231
+
232
+ ```sh
233
+ pdm add sentinel@git+https://codeberg.org/cr1901/sentinel@main
234
+ ```
235
+
236
+ I also cannot do a PyPI release for the same reason.
237
+
238
+ Between March and September 2024, I stopped being able to consistently fit
239
+ `AttoSoC` onto IceStick; the demo overflows between 1280-1300 ICESTORM_LCs
240
+ (maximum 1280 on device). According to bisect, the changes introduced by
241
+ Amaranth commit [1d2b9c3](https://github.com/amaranth-lang/amaranth/commit/1d2b9c309e5a0e06487105679eec361472978c5f)
242
+ pessimized `AttoSoC` _just_ enough to not fit. However, right now (2024-09-26)
243
+ releases are not blocked on the demo fitting on IceStick. _Assume the IceStick
244
+ demo is unreliable in this release._ I will look into this later.
245
+
246
+
247
+ ### Added
248
+ - Add ruff linter to dev dependencies and CI.
249
+ - Releases require linting to pass, _including this release!_
250
+ - Set up lint rules for Rust/`rustdoc` and Ruff.
251
+ - This release and future ones will require passing a lint check for code
252
+ and docstrings in CI. Non-release runs won't run the lint step.
253
+ - `lint` PDM composite script can optionally take arguments, like `-e` to
254
+ do Rust lint step on error in Python lint step.
255
+ - Basic fixes can be applied using the `lint-fix` PDM script.
256
+ - `sentinel-rt` is preemptively set up for `cargo fix` to work.
257
+ - `doc` PDM script can optionally take arguments, like `-n` to run
258
+ `sphinx-build` in [nitpicky mode](https://www.sphinx-doc.org/en/master/man/sphinx-build.html#cmdoption-sphinx-build-n).
259
+ This catches more broken yet benign cross-refs than the `doc-auto` script
260
+ will. In the case of Amaranth IP in particular, several broken cross-refs
261
+ are expected due to how `Components` are documented.
262
+ - Test only installing production dependencies, importing, and Verilog
263
+ generation in CI.
264
+ - Documentation has been written! It is hosted on [ReadTheDocs](https://sentinel-cpu.readthedocs.io/en/latest/).
265
+ - A few doctests have been added for good measure.
266
+ - ReadTheDocs handles building docs. However, this release and future ones
267
+ require docs to build and doctests to pass in CI. Non-release runs won't
268
+ run the docs step.
269
+ - Microcode assembly file is not handled for correctness by [`sphinx`](https://www.sphinx-doc.org).
270
+ Out of date/misleading comments were fixed.
271
+
272
+ _If microcode and `sphinx` documentation don't match, `sphinx` docs take
273
+ priority unless otherwise noted._
274
+ - [YoWASP](https://yowasp.org/) support for `import`ing `Top`, Verilog
275
+ generation and in-tree demos.
276
+ - Minimal prodouction dependencies/Quickstart is tested in CI using YoWASP.
277
+ - Allow firmware override/random BRAM content generation for `AttoSoC` demo
278
+ designs which are generated on a remote machine.
279
+ - Add `AttoSoC` demo support for [Arty A7 35T](https://digilent.com/shop/arty-a7-100t-artix-7-fpga-development-board/),
280
+ [Cmod S7](https://digilent.com/shop/cmod-s7-breadboardable-spartan-7-fpga-module/), and
281
+ [iCEBreaker v1.0](https://1bitsquared.com/collections/fpga/products/icebreaker)
282
+ boards.
283
+
284
+
285
+ ### Changed
286
+ - All simulations have been ported to adhere to RFC [#36](https://amaranth-lang.org/rfcs/0036-async-testbench-functions.html)
287
+ and [#62](https://amaranth-lang.org/rfcs/0062-memory-data.html).
288
+ - This resulted in more code-sharing between the handwritten and
289
+ upstream [pytest] simulations, as well as the RISCOF framework tests,
290
+ such as a simulated memory
291
+ [process](https://amaranth-lang.org/docs/amaranth/v0.5.4/simulator.html#amaranth.sim.Simulator.add_process).
292
+
293
+ Additionally, except for the appropriately-named `test_soc` file,
294
+ the `AttoSoC` example is no longer used in tests!
295
+ - Use [`pytest-amaranth-sim`] plugin for Amaranth-specific fixtures.
296
+ - `AttoSoC` example was ported to adhere to [#70](https://amaranth-lang.org/rfcs/0070-soc-memory-map-names.html).
297
+ - Current OSS CAD Suite version for CI is [2024-11-01](https://github.com/YosysHQ/oss-cad-suite-build/releases/tag/2024-11-01).
298
+ - Example Rust firmware greatly improved- a [Rule 110](https://en.wikipedia.org/wiki/Rule_110)
299
+ visualization over serial port [suggested by @mcclure](https://mastodon.social/@mcc/113244143342550101)!
300
+ - Various refactors that do not change code functionality:
301
+ - Rearrange top-level connections based on purpose.
302
+ - Data alignment logic was split into Components.
303
+ - An attempt was made to hoist out muxed inputs to the Datapath. However,
304
+ this did not optimize well. The Component- `DataPathSrcMux`- is kept around
305
+ as dead code in case it optimizes better in future versions.
306
+ - Move ALU source muxes into their own Components.
307
+ - `Insn` class to serve as the moral equivalent of an Amaranth
308
+ [`View`](https://amaranth-lang.org/docs/amaranth/v0.5.4/stdlib/data.html#amaranth.lib.data.View)
309
+ for RISC-V instructions.
310
+ - Decoder was split into several Components. In fact, the decoder was
311
+ _effectively rewritten_; the large Switch statement of the previous
312
+ versions was unreadable. The split components include:
313
+ - CSR Access Control
314
+ - Exception Control
315
+ - Mapping ROM
316
+ - Immediate Generation
317
+
318
+ AFAIR, none of the above refactors changed LUT usage meaningfully.
319
+ - Additionally, the Control Unit's `Signature` was overhauled.
320
+ - Manually specify the set of files to include in source dist. Specifically,
321
+ exclude submodules and extra test files, and include config files, examples,
322
+ and `sentinel-rt`.
323
+ - Tweak Rust firmware DoIt tasks to allow choosing bus type, call `cargo`
324
+ directly instead of invoking `pdm` again.
325
+ - _All_ `UCodeROM` fields are now verified against microcode file before
326
+ generating a [`Signature`](https://amaranth-lang.org/docs/amaranth/v0.5.4/stdlib/wiring.html#amaranth.lib.wiring.Signature),
327
+ not just `enum`s.
328
+ - Rename `UCodeROM` `enum_map` constructor parameter to `field_map`.
329
+ - Lots of small Ruff and Rust/`rustdoc` lints applied, so that CI passes :).
330
+ - Some files are ignored for lint. See `pyproject.toml` for justifications.
331
+ - Development/style guidelines have been refined, and changes made to the
332
+ reflect them:
333
+ - `Component` `Signature`s are now generated using annotations at the class
334
+ level when possible; previously, they were instance attributes. This should
335
+ have no functional change.
336
+ - Nested classes within `Insn` class are public.
337
+ - Most functions of `sentinel.gen` are private.
338
+ - Nest `Signature` object bindings into the objects that "own" them. This
339
+ paves the way to add a few more `Signature` object bindings next release.
340
+ - `Control` unit `Signature` has been greatly improved; it uses nested
341
+ `Signature` `Members` to logically organize microcode signals by purpose.
342
+
343
+ ### Fixed
344
+ - Use full git hash `a7fa902a5f70c7d53a654d850f745e36821fbb78` for [logLUTs](https://github.com/mattvenn/logLUTs)
345
+ benchmarking dependency (got weird errors trying to get PDM to download it
346
+ using the short hash as of Sept. 2024).
347
+ - Fixed UnusedElaboratable warning in `test_ucode_layout_gen` test
348
+ (thanks @kivikkak!)
349
+ - Sentinel uses `amaranth_soc.wishbone`, but this wasn't reflected in
350
+ [production dependencies](https://pdm-project.org/latest/usage/dependency/#select-a-subset-of-dependency-groups-to-install).
351
+ - Fix `license` field in `pyproject.toml. It was
352
+ [always meant](https://libera.irclog.whitequark.org/amaranth-lang/2023-11-25#35299928)
353
+ to be BSD-2-Clause, but I just accepted the defaults when originally
354
+ initializing the project with PDM :).
355
+ - Remove `regfile` module. This was accidentally committed before initial
356
+ release and never used.
357
+ - Do not use back-to-back write/read optimization for store instructions
358
+ until it's [clear](https://github.com/fossi-foundation/wishbone/issues/26) to
359
+ me that it's within spec.
360
+ - Various fixes where registers/signals did not get appropriate values on
361
+ _non-power-on_ resets:
362
+ - PC would either be initialized to `0` or `4`, depending on instruction.
363
+ - MCAUSE register was not cleared to `0`, as [privileged spec](https://riscv.org/specifications/ratified/)
364
+ requires for implementations that do not distinguish reset conditions.
365
+ - Wishbone `CYC` and `STB` would remain asserted after reset if the reset
366
+ happened in the middle of a bus cycle; WB spec
367
+ [requires](https://wishbone-interconnect.readthedocs.io/en/latest/03_classic.html#reset-operation)
368
+ `CYC` and `STB` to deassert upon `SYSCON` reset.
369
+ - Init code after reset now requires one extra cycle (5 cycles total) before
370
+ fetching the first instruction from the user program.
371
+ - Tests for these cases have been added to CI.
372
+ - `doit` tasks would sometimes use the wrong Python interpreter; use `sys.exectuable`
373
+ to indicate "this interpreter" as [recommended](https://docs.python.org/3/library/subprocess.html#subprocess.Popen)
374
+ instead.
375
+
376
+ ### Removed
377
+ - Remove special Rust PDM scripts by using .config/cargo.toml.
378
+ - Remove the `Simulator` fixture and `--vcds` option to pytest as provided by
379
+ this package. Instead, use equivalent fixtures/options provided by
380
+ [`pytest-amaranth-sim`].
381
+ - Flake8 linting has been completely replaced with Ruff. We enable
382
+ [preview mode](https://docs.astral.sh/ruff/preview/) to take advantage of
383
+ [unstable](https://docs.astral.sh/ruff/rules/#error-e) [rules](https://docs.astral.sh/ruff/rules/#pydoclint-doc)
384
+ that were provided by flake8.
385
+
386
+
387
+ ## [0.1.0-alpha.1] - 2024-03-12
388
+
389
+ First release after the `next`/`main` split.
390
+
391
+ ### Added
392
+ - Test gateware generation in CI.
393
+ - Updates available for dependencies are tracked with [Renovate Bot](https://www.mend.io/renovate/).
394
+ - Applies to both `main` and `next`.
395
+ - The `yosys` version for Verilog/RTLIL/gateware generation is also tracked in
396
+ CI using a [new workflow](https://codeberg.org/cr1901/sentinel/actions?workflow=update-yosys.yml).
397
+ - Current OSS CAD Suite version is [2024-03-01](https://github.com/YosysHQ/oss-cad-suite-build/releases/tag/2024-03-01).
398
+ - Demo SoC example can optionally use peripherals whose registers are
399
+ implemented using the [`amaranth-soc`] CSR bus.
400
+ - Only fits on HX8K Evaluation board at present.
401
+ - Peripherals are at different addresses when using the CSR bus; the Rust
402
+ firmware can detect which version of the gateware is loaded by querying
403
+ the `MIP` register after reset.
404
+ - Demo prints addresses of peripherals in table format.
405
+ - Rust Demo SoC can be simulated as part of [Pytest] tests.
406
+ - Disabled by default, pass `--runsoc` to `pytest` to enabled.
407
+ - Implement remote Demo SoC builds using [`paramiko`](https://www.paramiko.org/index.html).
408
+ - Add usage as a Python dependency in README.md.
409
+
410
+
411
+ ### Changed
412
+ - Replace ELF generator with [`pyelftools`](https://github.com/eliben/pyelftools).
413
+ - This simplifies the inline objcopy implementation.
414
+ - GPIO peripheral in SoC demo has input, output, and output-enable ports now.
415
+ - Use a dynamic Python version (_no releases ever saw the manual behavior_).
416
+ - [`dodo.py`](https://pydoit.org/) dependency graph has been cleaned up a bit.
417
+ - Start improving [Signatures](https://amaranth-lang.org/docs/amaranth/latest/stdlib/wiring.html#signatures)
418
+ used throughout Sentinel core.
419
+ - Mostly limited to Decoder, ExceptionRouter, and ALU for now.
420
+ - Many signals remain to be wired up to formal harness via Signatures, rather
421
+ that the formal harness reaching into Sentinel.
422
+ - Python, Rust, and CI dependencies have been updated to most recent versions.
423
+ - Rust firmware development [DoIt] tasks are no longer targeted to IceStick
424
+ only.
425
+ - HX8K development board support is up to parity with IceStick.
426
+
427
+
428
+ ### Fixed
429
+ - All Amaranth [deprecations](https://amaranth-lang.org/docs/amaranth/latest/changes.html#migrating-from-version-0-4)
430
+ for the upcoming version 0.5 have been addressed, up to commit [715a8d4](https://github.com/amaranth-lang/amaranth/tree/715a8d4).
431
+ - Correct `gen` usage outside pdm in README.md.
432
+ - `dodo.py` no longer errors when removing directory trees that don't exist.
433
+ - Removing dirs is required as part of RISCOF test cleanup.
434
+ - Load-bearing optimization implemented in [39005c1](https://codeberg.org/cr1901/sentinel/src/commit/39005c1)
435
+ that saves ~30 LUTs in SoC demo.
436
+ - Check to see if this can be removed/is no longer necessary.
437
+
438
+
439
+ ## [0.1.0-alpha] - 2023-11-29
440
+
441
+ Initial release. This is a retroactive release, created just before the
442
+ `next`/`main` split.
443
+
444
+ [PDM](https://pdm-project.org) should be used for interacting with this repo;
445
+ type `pdm run --list` for a list of commands. `pdm` will defer to [DoIt] for
446
+ complex tasks such as orchestrating [RISC-V Formal](https://github.com/YosysHQ/riscv-formal).
447
+
448
+ [Pytest](https://pytest.org) is used for basic testing, and [Flake8](https://flake8.pycqa.org)
449
+ is used for linting. Due to code cleanups required, as well as some tooling
450
+ still being in flux, _no documentation beyond the CHANGELOG.md and README.md
451
+ is provided yet._
452
+
453
+ **Due to git dependencies, this release is only usable within the `pdm`
454
+ environment**. Specifically, the SoC example, tests, and Verilog generation
455
+ works, but using Sentinel as a dependency of another Python/[Amaranth]/`pdm`
456
+ project _does not work_.
457
+
458
+ ### Added
459
+ - Working SoC example for [Lattice IceStick](https://www.latticesemi.com/icestick)
460
+ and [iCE40-HX8K Breakout Board](https://www.latticesemi.com/Products/DevelopmentBoardsAndKits/iCE40HX8KBreakoutBoard.aspx).
461
+ - Includes custom Amaranth peripherals and a contrived [Rust](https://www.rust-lang.org/)
462
+ firmware.
463
+
464
+ Run using `pdm demo` (Assembly firmware) or `pdm demo-rust` (Rust firmware).
465
+ - Demo is using [special options](https://libera.irclog.whitequark.org/yosys/2023-11-20#1700497858-1700497760)
466
+ to [yosys](https://yosyshq.net/yosys/) to make Sentinel fit onto IceStick.
467
+ - Microcode written using the [m5meta](https://github.com/brouhaha/m5meta/)
468
+ microcode assembler, version 1.x.
469
+ - An upcoming version 2.x of `m5meta` is expected in the moderate-near
470
+ future. I plan to rewrite the microcode then, and _the rewrite will not
471
+ be compatible with version 1.x._
472
+ - Working RISC-V soft-core implementing the [RV32I_Zcsr specification](https://github.com/riscv/riscv-isa-manual/releases/tag/Ratified-IMAFDQC).
473
+ - Core passes the RISC-V Formal verification tests, as well as the [tests](https://github.com/riscv-non-isa/riscv-arch-test)
474
+ used by RISC-V International as part of the [RISCOF framework](https://github.com/riscv-software-src/riscof).
475
+ - Bespoke test suite with my own custom tests and [pytest] fixtures for
476
+ simulating Sentinel with Amaranth's Python simulator.
477
+ - Many of the pytest test come from an [older test suite](https://github.com/riscv-software-src/riscv-tests)
478
+ no-longer used by RISC-V International. I feel they are fine as a first
479
+ layer of tests to detect immediate breakage of Sentinel.
480
+ - CI using [Github Actions](https://github.com/cr1901/sentinel/actions) tests
481
+ using pytest, RISC-V Formal, RISCOF, and demo synthesis every push and PR.
482
+ - The demo test is allowed to fail due to lack of space on Icestick due to
483
+ different compilers optimizing `yosys` slightly differently. See
484
+ [#2](https://codeberg.org/cr1901/sentinel/issues/2).
485
+ - A nice logo by [Tokino Kei](https://tokinokei.carrd.co/) :).
486
+
487
+ [Amaranth]: https://amaranth-lang.org/
488
+ [`amaranth`]: https://github.com/amaranth-lang/amaranth
489
+ [`amaranth-boards`]: https://github.com/amaranth-lang/amaranth-boards
490
+ [`amaranth-soc`]: https://github.com/amaranth-lang/amaranth-soc
491
+ [`amaranth-stdio`]: https://github.com/amaranth-lang/amaranth-stdio
492
+ [DoIt]: https://pydoit.org/
493
+ [pytest]: https://pytest.org
494
+ [`pytest-amaranth-sim`]: https://github.com/cr1901/pytest-amaranth-sim
495
+
496
+ [Unreleased]: https://codeberg.org/cr1901/sentinel/compare/v0.1.0-beta.2..next
497
+ [0.1.0-beta.2]: https://codeberg.org/cr1901/sentinel/compare/v0.1.0-beta.1..v0.1.0-beta.2
498
+ [0.1.0-beta.1]: https://codeberg.org/cr1901/sentinel/compare/v0.1.0-beta..v0.1.0-beta.1
499
+ [0.1.0-beta]: https://codeberg.org/cr1901/sentinel/compare/v0.1.0-alpha.1..v0.1.0-beta
500
+ [0.1.0-alpha.1]: https://codeberg.org/cr1901/sentinel/compare/v0.1.0-alpha..v0.1.0-alpha.1
501
+ [0.1.0-alpha]: https://codeberg.org/cr1901/sentinel/releases/tag/v0.1.0-alpha
502
+
503
+ <!-- Skeleton generated by git-cliff. Maintained by hand. -->