peakrdl-busdecoder 0.6.0__tar.gz → 0.6.1__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 (124) hide show
  1. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/PKG-INFO +1 -1
  2. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/pyproject.toml +1 -1
  3. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/apb3/apb3_cpuif.py +2 -1
  4. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/apb3/apb3_cpuif_flat.py +9 -3
  5. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/apb3/apb3_interface.py +2 -1
  6. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/apb4/apb4_cpuif.py +2 -1
  7. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/apb4/apb4_cpuif_flat.py +9 -3
  8. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/apb4/apb4_interface.py +2 -1
  9. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/axi4lite/axi4_lite_cpuif.py +2 -1
  10. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/axi4lite/axi4_lite_cpuif_flat.py +12 -4
  11. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/axi4lite/axi4_lite_interface.py +3 -2
  12. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/base_cpuif.py +2 -1
  13. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/fanout_gen.py +1 -1
  14. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder.egg-info/PKG-INFO +1 -1
  15. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/uv.lock +1 -1
  16. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.devcontainer/Dockerfile +0 -0
  17. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.devcontainer/devcontainer.json +0 -0
  18. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  20. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/ISSUE_TEMPLATE/question.md +0 -0
  21. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/pull_request_template.md +0 -0
  22. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/workflows/build.yml +0 -0
  23. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/workflows/docs.yml +0 -0
  24. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/workflows/format.yml +0 -0
  25. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/workflows/lint.yml +0 -0
  26. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/workflows/release.yml +0 -0
  27. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/workflows/test.yml +0 -0
  28. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.github/workflows/typecheck.yml +0 -0
  29. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.gitignore +0 -0
  30. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/.readthedocs.yaml +0 -0
  31. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/CONTRIBUTING.md +0 -0
  32. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/LICENSE +0 -0
  33. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/MANIFEST.in +0 -0
  34. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/README.md +0 -0
  35. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/Makefile +0 -0
  36. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/api.rst +0 -0
  37. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/architecture.rst +0 -0
  38. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/conf.py +0 -0
  39. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/configuring.rst +0 -0
  40. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/cpuif/apb.rst +0 -0
  41. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/cpuif/avalon.rst +0 -0
  42. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/cpuif/axi4lite.rst +0 -0
  43. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/cpuif/customizing.rst +0 -0
  44. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/cpuif/internal_protocol.rst +0 -0
  45. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/cpuif/introduction.rst +0 -0
  46. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/cpuif/passthrough.rst +0 -0
  47. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/Alpha-Beta Versioning +0 -0
  48. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/Hierarchy-and-Indexing +0 -0
  49. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/Program Flow +0 -0
  50. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/Resets +0 -0
  51. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/Signal Dereferencer +0 -0
  52. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/Validation Needed +0 -0
  53. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/template-layers/1-port-declaration +0 -0
  54. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/template-layers/1.1.hardware-interface +0 -0
  55. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/template-layers/2-CPUIF +0 -0
  56. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/template-layers/3-address-decode +0 -0
  57. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/template-layers/4-fields +0 -0
  58. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/template-layers/5-readback-mux +0 -0
  59. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/dev_notes/template-layers/6-output-port-mapping +0 -0
  60. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/diagrams/arch.png +0 -0
  61. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/diagrams/diagrams.odg +0 -0
  62. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/diagrams/rbuf.png +0 -0
  63. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/diagrams/readback.png +0 -0
  64. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/diagrams/wbuf.png +0 -0
  65. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/faq.rst +0 -0
  66. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/hwif.rst +0 -0
  67. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/img/err.svg +0 -0
  68. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/img/ok.svg +0 -0
  69. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/img/warn.svg +0 -0
  70. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/index.rst +0 -0
  71. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/licensing.rst +0 -0
  72. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/limitations.rst +0 -0
  73. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/props/addrmap.rst +0 -0
  74. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/props/field.rst +0 -0
  75. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/props/reg.rst +0 -0
  76. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/props/rhs_props.rst +0 -0
  77. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/props/signal.rst +0 -0
  78. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/rdl_features/external.rst +0 -0
  79. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/requirements.txt +0 -0
  80. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/docs/udps/intro.rst +0 -0
  81. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/hdl-src/README.md +0 -0
  82. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/hdl-src/apb3_intf.sv +0 -0
  83. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/hdl-src/apb4_intf.sv +0 -0
  84. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/hdl-src/avalon_mm_intf.sv +0 -0
  85. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/hdl-src/axi4lite_intf.sv +0 -0
  86. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/setup.cfg +0 -0
  87. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/__init__.py +0 -0
  88. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/__peakrdl__.py +0 -0
  89. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/body/__init__.py +0 -0
  90. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/body/body.py +0 -0
  91. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/body/combinational_body.py +0 -0
  92. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/body/for_loop_body.py +0 -0
  93. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/body/if_body.py +0 -0
  94. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/body/struct_body.py +0 -0
  95. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/__init__.py +0 -0
  96. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/apb3/__init__.py +0 -0
  97. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/apb3/apb3_tmpl.sv +0 -0
  98. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/apb4/__init__.py +0 -0
  99. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/apb4/apb4_tmpl.sv +0 -0
  100. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/axi4lite/__init__.py +0 -0
  101. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/axi4lite/axi4_lite_tmpl.sv +0 -0
  102. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/fanin_gen.py +0 -0
  103. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/fanin_intermediate_gen.py +0 -0
  104. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/cpuif/interface.py +0 -0
  105. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/decode_logic_gen.py +0 -0
  106. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/design_scanner.py +0 -0
  107. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/design_state.py +0 -0
  108. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/exporter.py +0 -0
  109. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/identifier_filter.py +0 -0
  110. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/listener.py +0 -0
  111. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/module_tmpl.sv +0 -0
  112. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/package_tmpl.sv +0 -0
  113. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/py.typed +0 -0
  114. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/struct_gen.py +0 -0
  115. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/sv_int.py +0 -0
  116. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/udps/__init__.py +0 -0
  117. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/utils.py +0 -0
  118. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder/validate_design.py +0 -0
  119. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder.egg-info/SOURCES.txt +0 -0
  120. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder.egg-info/dependency_links.txt +0 -0
  121. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder.egg-info/entry_points.txt +0 -0
  122. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder.egg-info/requires.txt +0 -0
  123. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/src/peakrdl_busdecoder.egg-info/top_level.txt +0 -0
  124. {peakrdl_busdecoder-0.6.0 → peakrdl_busdecoder-0.6.1}/tools/shims/xargs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: peakrdl-busdecoder
3
- Version: 0.6.0
3
+ Version: 0.6.1
4
4
  Summary: Generate a SystemVerilog bus decoder from SystemRDL for splitting CPU interfaces to multiple sub-address spaces
5
5
  Author: Arnav Sacheti
6
6
  License: LGPLv3
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "peakrdl-busdecoder"
7
- version = "0.6.0"
7
+ version = "0.6.1"
8
8
  requires-python = ">=3.10"
9
9
  dependencies = [
10
10
  "jinja2~=3.1",
@@ -1,3 +1,4 @@
1
+ from collections import deque
1
2
  from typing import TYPE_CHECKING, overload
2
3
 
3
4
  from systemrdl.node import AddressableNode
@@ -32,7 +33,7 @@ class APB3Cpuif(BaseCpuif):
32
33
  def signal(self, signal: str, node: AddressableNode | None = None, indexer: str | None = None) -> str:
33
34
  return self._interface.signal(signal, node, indexer)
34
35
 
35
- def fanout(self, node: AddressableNode) -> str:
36
+ def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
36
37
  fanout: dict[str, str] = {}
37
38
  fanout[self.signal("PSEL", node, "gi")] = (
38
39
  f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}|cpuif_rd_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
@@ -1,8 +1,10 @@
1
+ from collections import deque
1
2
  from typing import TYPE_CHECKING
2
3
 
3
4
  from systemrdl.node import AddressableNode
4
5
 
5
- from ...utils import get_indexed_path
6
+ from ...sv_int import SVInt
7
+ from ...utils import clog2, get_indexed_path
6
8
  from ..base_cpuif import BaseCpuif
7
9
  from .apb3_interface import APB3FlatInterface
8
10
 
@@ -33,8 +35,12 @@ class APB3CpuifFlat(BaseCpuif):
33
35
  ) -> str:
34
36
  return self._interface.signal(signal, node, idx)
35
37
 
36
- def fanout(self, node: AddressableNode) -> str:
38
+ def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
37
39
  fanout: dict[str, str] = {}
40
+ addr_comp = [f"{self.signal('PADDR')}"]
41
+ for i, stride in enumerate(array_stack):
42
+ addr_comp.append(f"(gi{i}*{SVInt(stride, self.addr_width)})")
43
+
38
44
  fanout[self.signal("PSEL", node, "gi")] = (
39
45
  f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}|cpuif_rd_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
40
46
  )
@@ -42,7 +48,7 @@ class APB3CpuifFlat(BaseCpuif):
42
48
  fanout[self.signal("PWRITE", node, "gi")] = (
43
49
  f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
44
50
  )
45
- fanout[self.signal("PADDR", node, "gi")] = self.signal("PADDR")
51
+ fanout[self.signal("PADDR", node, "gi")] = f"{{{'-'.join(addr_comp)}}}[{clog2(node.size) - 1}:0]"
46
52
  fanout[self.signal("PWDATA", node, "gi")] = "cpuif_wr_data"
47
53
 
48
54
  return "\n".join(map(lambda kv: f"assign {kv[0]} = {kv[1]};", fanout.items()))
@@ -2,6 +2,7 @@
2
2
 
3
3
  from systemrdl.node import AddressableNode
4
4
 
5
+ from ...utils import clog2
5
6
  from ..interface import FlatInterface, SVInterface
6
7
 
7
8
 
@@ -48,7 +49,7 @@ class APB3FlatInterface(FlatInterface):
48
49
  f"output logic {self.signal('PSEL', child)}",
49
50
  f"output logic {self.signal('PENABLE', child)}",
50
51
  f"output logic {self.signal('PWRITE', child)}",
51
- f"output logic [{self.cpuif.addr_width - 1}:0] {self.signal('PADDR', child)}",
52
+ f"output logic [{clog2(child.size) - 1}:0] {self.signal('PADDR', child)}",
52
53
  f"output logic [{self.cpuif.data_width - 1}:0] {self.signal('PWDATA', child)}",
53
54
  f"input logic [{self.cpuif.data_width - 1}:0] {self.signal('PRDATA', child)}",
54
55
  f"input logic {self.signal('PREADY', child)}",
@@ -1,3 +1,4 @@
1
+ from collections import deque
1
2
  from typing import TYPE_CHECKING, overload
2
3
 
3
4
  from systemrdl.node import AddressableNode
@@ -33,7 +34,7 @@ class APB4Cpuif(BaseCpuif):
33
34
  def signal(self, signal: str, node: AddressableNode | None = None, indexer: str | None = None) -> str:
34
35
  return self._interface.signal(signal, node, indexer)
35
36
 
36
- def fanout(self, node: AddressableNode) -> str:
37
+ def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
37
38
  fanout: dict[str, str] = {}
38
39
  fanout[self.signal("PSEL", node, "gi")] = (
39
40
  f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}|cpuif_rd_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
@@ -1,8 +1,10 @@
1
+ from collections import deque
1
2
  from typing import TYPE_CHECKING
2
3
 
3
4
  from systemrdl.node import AddressableNode
4
5
 
5
- from ...utils import get_indexed_path
6
+ from ...sv_int import SVInt
7
+ from ...utils import clog2, get_indexed_path
6
8
  from ..base_cpuif import BaseCpuif
7
9
  from .apb4_interface import APB4FlatInterface
8
10
 
@@ -33,8 +35,12 @@ class APB4CpuifFlat(BaseCpuif):
33
35
  ) -> str:
34
36
  return self._interface.signal(signal, node, idx)
35
37
 
36
- def fanout(self, node: AddressableNode) -> str:
38
+ def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
37
39
  fanout: dict[str, str] = {}
40
+ addr_comp = [f"{self.signal('PADDR')}"]
41
+ for i, stride in enumerate(array_stack):
42
+ addr_comp.append(f"(gi{i}*{SVInt(stride, self.addr_width)})")
43
+
38
44
  fanout[self.signal("PSEL", node, "gi")] = (
39
45
  f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}|cpuif_rd_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
40
46
  )
@@ -42,7 +48,7 @@ class APB4CpuifFlat(BaseCpuif):
42
48
  fanout[self.signal("PWRITE", node, "gi")] = (
43
49
  f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
44
50
  )
45
- fanout[self.signal("PADDR", node, "gi")] = self.signal("PADDR")
51
+ fanout[self.signal("PADDR", node, "gi")] = f"{{{'-'.join(addr_comp)}}}[{clog2(node.size) - 1}:0]"
46
52
  fanout[self.signal("PPROT", node, "gi")] = self.signal("PPROT")
47
53
  fanout[self.signal("PWDATA", node, "gi")] = "cpuif_wr_data"
48
54
  fanout[self.signal("PSTRB", node, "gi")] = "cpuif_wr_byte_en"
@@ -2,6 +2,7 @@
2
2
 
3
3
  from systemrdl.node import AddressableNode
4
4
 
5
+ from ...utils import clog2
5
6
  from ..interface import FlatInterface, SVInterface
6
7
 
7
8
 
@@ -50,7 +51,7 @@ class APB4FlatInterface(FlatInterface):
50
51
  f"output logic {self.signal('PSEL', child)}",
51
52
  f"output logic {self.signal('PENABLE', child)}",
52
53
  f"output logic {self.signal('PWRITE', child)}",
53
- f"output logic [{self.cpuif.addr_width - 1}:0] {self.signal('PADDR', child)}",
54
+ f"output logic [{clog2(child.size) - 1}:0] {self.signal('PADDR', child)}",
54
55
  f"output logic [2:0] {self.signal('PPROT', child)}",
55
56
  f"output logic [{self.cpuif.data_width - 1}:0] {self.signal('PWDATA', child)}",
56
57
  f"output logic [{self.cpuif.data_width // 8 - 1}:0] {self.signal('PSTRB', child)}",
@@ -1,3 +1,4 @@
1
+ from collections import deque
1
2
  from typing import TYPE_CHECKING, overload
2
3
 
3
4
  from systemrdl.node import AddressableNode
@@ -33,7 +34,7 @@ class AXI4LiteCpuif(BaseCpuif):
33
34
  def signal(self, signal: str, node: AddressableNode | None = None, indexer: str | None = None) -> str:
34
35
  return self._interface.signal(signal, node, indexer)
35
36
 
36
- def fanout(self, node: AddressableNode) -> str:
37
+ def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
37
38
  fanout: dict[str, str] = {}
38
39
 
39
40
  wr_sel = f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
@@ -1,8 +1,10 @@
1
+ from collections import deque
1
2
  from typing import TYPE_CHECKING, overload
2
3
 
3
4
  from systemrdl.node import AddressableNode
4
5
 
5
- from ...utils import get_indexed_path
6
+ from ...sv_int import SVInt
7
+ from ...utils import clog2, get_indexed_path
6
8
  from ..base_cpuif import BaseCpuif
7
9
  from .axi4_lite_interface import AXI4LiteFlatInterface
8
10
 
@@ -35,15 +37,21 @@ class AXI4LiteCpuifFlat(BaseCpuif):
35
37
  def signal(self, signal: str, node: AddressableNode | None = None, indexer: str | None = None) -> str:
36
38
  return self._interface.signal(signal, node, indexer)
37
39
 
38
- def fanout(self, node: AddressableNode) -> str:
40
+ def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
39
41
  fanout: dict[str, str] = {}
42
+ waddr_comp = [f"{self.signal('AWADDR')}"]
43
+ raddr_comp = [f"{self.signal('ARADDR')}"]
44
+ for i, stride in enumerate(array_stack):
45
+ offset = f"(gi{i}*{SVInt(stride, self.addr_width)})"
46
+ waddr_comp.append(offset)
47
+ raddr_comp.append(offset)
40
48
 
41
49
  wr_sel = f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
42
50
  rd_sel = f"cpuif_rd_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
43
51
 
44
52
  # Write address channel
45
53
  fanout[self.signal("AWVALID", node, "gi")] = wr_sel
46
- fanout[self.signal("AWADDR", node, "gi")] = self.signal("AWADDR")
54
+ fanout[self.signal("AWADDR", node, "gi")] = f"{{{'-'.join(waddr_comp)}}}[{clog2(node.size) - 1}:0]"
47
55
  fanout[self.signal("AWPROT", node, "gi")] = self.signal("AWPROT")
48
56
 
49
57
  # Write data channel
@@ -56,7 +64,7 @@ class AXI4LiteCpuifFlat(BaseCpuif):
56
64
 
57
65
  # Read address channel
58
66
  fanout[self.signal("ARVALID", node, "gi")] = rd_sel
59
- fanout[self.signal("ARADDR", node, "gi")] = self.signal("ARADDR")
67
+ fanout[self.signal("ARADDR", node, "gi")] = f"{{{'-'.join(raddr_comp)}}}[{clog2(node.size) - 1}:0]"
60
68
  fanout[self.signal("ARPROT", node, "gi")] = self.signal("ARPROT")
61
69
 
62
70
  # Read data channel (master -> slave)
@@ -2,6 +2,7 @@
2
2
 
3
3
  from systemrdl.node import AddressableNode
4
4
 
5
+ from ...utils import clog2
5
6
  from ..interface import FlatInterface, SVInterface
6
7
 
7
8
 
@@ -60,7 +61,7 @@ class AXI4LiteFlatInterface(FlatInterface):
60
61
  # Write address channel
61
62
  f"output logic {self.signal('AWVALID', child)}",
62
63
  f"input logic {self.signal('AWREADY', child)}",
63
- f"output logic [{self.cpuif.addr_width - 1}:0] {self.signal('AWADDR', child)}",
64
+ f"output logic [{clog2(child.size) - 1}:0] {self.signal('AWADDR', child)}",
64
65
  f"output logic [2:0] {self.signal('AWPROT', child)}",
65
66
  # Write data channel
66
67
  f"output logic {self.signal('WVALID', child)}",
@@ -74,7 +75,7 @@ class AXI4LiteFlatInterface(FlatInterface):
74
75
  # Read address channel
75
76
  f"output logic {self.signal('ARVALID', child)}",
76
77
  f"input logic {self.signal('ARREADY', child)}",
77
- f"output logic [{self.cpuif.addr_width - 1}:0] {self.signal('ARADDR', child)}",
78
+ f"output logic [{clog2(child.size) - 1}:0] {self.signal('ARADDR', child)}",
78
79
  f"output logic [2:0] {self.signal('ARPROT', child)}",
79
80
  # Read data channel
80
81
  f"input logic {self.signal('RVALID', child)}",
@@ -1,5 +1,6 @@
1
1
  import inspect
2
2
  import os
3
+ from collections import deque
3
4
  from typing import TYPE_CHECKING
4
5
 
5
6
  import jinja2 as jj
@@ -106,7 +107,7 @@ class BaseCpuif:
106
107
 
107
108
  return f"({cpuif_addr} - 'h{addr:x})[{clog2(size) - 1}:0]"
108
109
 
109
- def fanout(self, node: AddressableNode) -> str:
110
+ def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
110
111
  raise NotImplementedError
111
112
 
112
113
  def fanin(self, node: AddressableNode | None = None) -> str:
@@ -43,7 +43,7 @@ class FanoutGenerator(BusDecoderListener):
43
43
  )
44
44
  self._stack.append(fb)
45
45
 
46
- self._stack[-1] += self._cpuif.fanout(node)
46
+ self._stack[-1] += self._cpuif.fanout(node, self._array_stride_stack)
47
47
 
48
48
  return action
49
49
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: peakrdl-busdecoder
3
- Version: 0.6.0
3
+ Version: 0.6.1
4
4
  Summary: Generate a SystemVerilog bus decoder from SystemRDL for splitting CPU interfaces to multiple sub-address spaces
5
5
  Author: Arnav Sacheti
6
6
  License: LGPLv3
@@ -608,7 +608,7 @@ wheels = [
608
608
 
609
609
  [[package]]
610
610
  name = "peakrdl-busdecoder"
611
- version = "0.6.0"
611
+ version = "0.6.1"
612
612
  source = { editable = "." }
613
613
  dependencies = [
614
614
  { name = "jinja2" },