SimplHDL 0.12.1__tar.gz → 0.13.2__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 (157) hide show
  1. {simplhdl-0.12.1/src/simplhdl.egg-info → simplhdl-0.13.2}/PKG-INFO +1 -1
  2. {simplhdl-0.12.1 → simplhdl-0.13.2}/pyproject.toml +2 -0
  3. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/__init__.py +1 -1
  4. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/cli/info.py +6 -2
  5. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/cocotb.py +13 -2
  6. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/project/files.py +6 -2
  7. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/utils.py +24 -0
  8. {simplhdl-0.12.1 → simplhdl-0.13.2/src/simplhdl.egg-info}/PKG-INFO +1 -1
  9. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl.egg-info/SOURCES.txt +1 -0
  10. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl.egg-info/entry_points.txt +1 -0
  11. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl.egg-info/top_level.txt +1 -0
  12. simplhdl-0.13.2/src/simplhdl_jinja2/jinja2.py +25 -0
  13. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/quartusexport/quartusexportflow.py +19 -6
  14. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/spd.py +5 -4
  15. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/vivadoexport/vivadoexportflow.py +15 -5
  16. {simplhdl-0.12.1 → simplhdl-0.13.2}/LICENSE +0 -0
  17. {simplhdl-0.12.1 → simplhdl-0.13.2}/README.md +0 -0
  18. {simplhdl-0.12.1 → simplhdl-0.13.2}/setup.cfg +0 -0
  19. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/__main__.py +0 -0
  20. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/_compat.py +0 -0
  21. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/cli/arguments.py +0 -0
  22. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/cli/run.py +0 -0
  23. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/plugin/__init__.py +0 -0
  24. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/plugin/flow.py +0 -0
  25. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/plugin/generator.py +0 -0
  26. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/plugin/implementationflow.py +0 -0
  27. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/plugin/loader.py +0 -0
  28. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/plugin/parser.py +0 -0
  29. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/plugin/simulationflow.py +0 -0
  30. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/project/__init__.py +0 -0
  31. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/project/attributes.py +0 -0
  32. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/project/base.py +0 -0
  33. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/project/design.py +0 -0
  34. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/project/fileset.py +0 -0
  35. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/project/project.py +0 -0
  36. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/simplhdl.py +0 -0
  37. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl/tools.py +0 -0
  38. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl.egg-info/dependency_links.txt +0 -0
  39. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl.egg-info/requires.txt +0 -0
  40. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_chisel/chisel.py +0 -0
  41. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_encrypt/__init__.py +0 -0
  42. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_encrypt/encrypt/__init__.py +0 -0
  43. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_encrypt/encrypt/encryptflow.py +0 -0
  44. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_fusesocparser/__init__.py +0 -0
  45. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_fusesocparser/fusesocparser.py +0 -0
  46. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_icarus/__init__.py +0 -0
  47. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_icarus/icarusflow.py +0 -0
  48. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_icarus/resources/__init__.py +0 -0
  49. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_icarus/resources/templates/__init__.py +0 -0
  50. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_icarus/resources/templates/icarus/Makefile.j2 +0 -0
  51. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_icarus/resources/templates/icarus/__init__.py +0 -0
  52. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_icarus/resources/templates/icarus/cmds.f.j2 +0 -0
  53. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_icarus/resources/templates/icarus/cocotb.mk.j2 +0 -0
  54. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_icarus/resources/templates/icarus/simplhdl_iverilog_dump.v.j2 +0 -0
  55. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_icarus/resources/templates/icarus/sources.mk.j2 +0 -0
  56. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/__init__.py +0 -0
  57. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/flake8/flake8flow.py +0 -0
  58. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/lint/lintflow.py +0 -0
  59. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/resources/__init__.py +0 -0
  60. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/resources/templates/__init__.py +0 -0
  61. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/resources/templates/flake8/__init__.py +0 -0
  62. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/resources/templates/flake8/setup.cfg.j2 +0 -0
  63. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/resources/templates/verible/__init__.py +0 -0
  64. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/resources/templates/verible/rules.cfg.j2 +0 -0
  65. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/resources/templates/vsg/__init__.py +0 -0
  66. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/resources/templates/vsg/files.json.j2 +0 -0
  67. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/resources/templates/vsg/rules.yml.j2 +0 -0
  68. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/verible/__init__.py +0 -0
  69. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/verible/veribleflow.py +0 -0
  70. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/vsg/__init__.py +0 -0
  71. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_lint/vsg/vsgflow.py +0 -0
  72. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/__init__.py +0 -0
  73. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/modelsim/__init__.py +0 -0
  74. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/modelsim/modelsimflow.py +0 -0
  75. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/__init__.py +0 -0
  76. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/templates/__init__.py +0 -0
  77. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/templates/modelsim/Makefile.j2 +0 -0
  78. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/templates/modelsim/__init__.py +0 -0
  79. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/templates/modelsim/cocotb.mk.j2 +0 -0
  80. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/templates/modelsim/dependencies.mk.j2 +0 -0
  81. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/templates/modelsim/files.j2 +0 -0
  82. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/templates/modelsim/fileset.j2 +0 -0
  83. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/templates/modelsim/modelsim.tcl.j2 +0 -0
  84. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/templates/modelsim/project.mk.j2 +0 -0
  85. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_modelsim/resources/templates/modelsim/run.do.j2 +0 -0
  86. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_parser/__init__.py +0 -0
  87. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_parser/simplhdlparser.py +0 -0
  88. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_peakrdl/__init__.py +0 -0
  89. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_peakrdl/systemrdl.py +0 -0
  90. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/quartusdse/__init__.py +0 -0
  91. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/quartusdse/quartusdseflow.py +0 -0
  92. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/quartusexport/__init__.py +0 -0
  93. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/quartusflow.py +0 -0
  94. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/resources/__init__.py +0 -0
  95. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/resources/templates/__init__.py +0 -0
  96. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/resources/templates/quartus/__init__.py +0 -0
  97. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/resources/templates/quartus/project.tcl.j2 +0 -0
  98. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_quartus/resources/templates/quartus/run.tcl.j2 +0 -0
  99. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_questasim/questasim/__init__.py +0 -0
  100. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_questasim/questasim/questasimflow.py +0 -0
  101. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_questasim/resources/__init__.py +0 -0
  102. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_questasim/resources/templates/__init__.py +0 -0
  103. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_questasim/resources/templates/questasim/__init__.py +0 -0
  104. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_questasim/resources/templates/questasim/modelsim.tcl.j2 +0 -0
  105. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_questasim/resources/templates/questasim/project.qrun.j2 +0 -0
  106. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_questasim/resources/templates/questasim/visualizer.tcl.j2 +0 -0
  107. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_questasim/resources/templates/questasim/vsim-run.do.j2 +0 -0
  108. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/__init__.py +0 -0
  109. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/resources/__init__.py +0 -0
  110. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/resources/templates/__init__.py +0 -0
  111. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/resources/templates/rivierapro/Makefile.j2 +0 -0
  112. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/resources/templates/rivierapro/__init__.py +0 -0
  113. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/resources/templates/rivierapro/cocotb.mk.j2 +0 -0
  114. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/resources/templates/rivierapro/dependencies.mk.j2 +0 -0
  115. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/resources/templates/rivierapro/files.j2 +0 -0
  116. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/resources/templates/rivierapro/fileset.j2 +0 -0
  117. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/resources/templates/rivierapro/project.mk.j2 +0 -0
  118. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/rivierapro/__init__.py +0 -0
  119. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_rivierapro/rivierapro/rivieraproflow.py +0 -0
  120. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/__init__.py +0 -0
  121. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/__init__.py +0 -0
  122. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/__init__.py +0 -0
  123. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/Makefile.j2 +0 -0
  124. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/__init__.py +0 -0
  125. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/cocotb.mk.j2 +0 -0
  126. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/dependencies.mk.j2 +0 -0
  127. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/files.j2 +0 -0
  128. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/fileset.j2 +0 -0
  129. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/pli.tab.j2 +0 -0
  130. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/project.mk.j2 +0 -0
  131. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/simv-run.do.j2 +0 -0
  132. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/synopsys_sim.setup.j2 +0 -0
  133. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/resources/templates/vcs/vcs.parameters.j2 +0 -0
  134. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/vcs/__init__.py +0 -0
  135. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vcs/vcs/vcsflow.py +0 -0
  136. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/__init__.py +0 -0
  137. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/ipxact.py +0 -0
  138. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/__init__.py +0 -0
  139. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/__init__.py +0 -0
  140. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/vivado/__init__.py +0 -0
  141. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/vivado/project.tcl.j2 +0 -0
  142. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/vivado/run.tcl.j2 +0 -0
  143. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/vivado/steps.tcl.j2 +0 -0
  144. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/xsim/Makefile.j2 +0 -0
  145. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/xsim/__init__.py +0 -0
  146. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/xsim/cocotb.mk.j2 +0 -0
  147. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/xsim/dependencies.mk.j2 +0 -0
  148. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/xsim/files.j2 +0 -0
  149. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/xsim/fileset.j2 +0 -0
  150. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/resources/templates/xsim/project.mk.j2 +0 -0
  151. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/vivadoexport/__init__.py +0 -0
  152. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/vivadoflow.py +0 -0
  153. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/xsim/__init__.py +0 -0
  154. {simplhdl-0.12.1 → simplhdl-0.13.2}/src/simplhdl_vivado/xsim/xsimflow.py +0 -0
  155. {simplhdl-0.12.1 → simplhdl-0.13.2}/tests/test_design.py +0 -0
  156. {simplhdl-0.12.1 → simplhdl-0.13.2}/tests/test_files.py +0 -0
  157. {simplhdl-0.12.1 → simplhdl-0.13.2}/tests/test_fileset.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simplhdl
3
- Version: 0.12.1
3
+ Version: 0.13.2
4
4
  Summary: A framework for simulating and implementing HDL designs
5
5
  Author-email: Rasmus Grøndahl Olsen <simplhdl@gmail.com>
6
6
  Maintainer-email: Rasmus Grøndahl Olsen <simplhdl@gmail.com>
@@ -73,6 +73,7 @@ entry-points."simplhdl.plugins".chisel_generator = "simplhdl_chisel.chisel:Chise
73
73
  entry-points."simplhdl.plugins".encrypt = "simplhdl_encrypt.encrypt.encryptflow:EncryptFlow"
74
74
  entry-points."simplhdl.plugins".fusersoc_parser = "simplhdl_fusesocparser.fusesocparser:FuseSocParser"
75
75
  entry-points."simplhdl.plugins".icarus = "simplhdl_icarus.icarusflow:IcarusFlow"
76
+ entry-points."simplhdl.plugins".jinja2 = "simplhdl_jinja2.jinja2:Jinja2Generator"
76
77
  entry-points."simplhdl.plugins".lint = "simplhdl_lint.lint.lintflow:LintFlow"
77
78
  entry-points."simplhdl.plugins".modelsim = "simplhdl_modelsim.modelsim.modelsimflow:ModelSimFlow"
78
79
  entry-points."simplhdl.plugins".peakrdl_generator = "simplhdl_peakrdl.systemrdl:PeakRdlGenerator"
@@ -108,6 +109,7 @@ lint.isort = { known-first-party = [
108
109
  "simplhdl_encrypt",
109
110
  "simplhdl_fusesocparser",
110
111
  "simplhdl_icarus",
112
+ "simplhdl_jinja2",
111
113
  "simplhdl_lint",
112
114
  "simplhdl_modelsim",
113
115
  "simplhdl_parser",
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.12.1"
3
+ __version__ = "0.13.2"
4
4
 
5
5
  from .__main__ import parse_arguments
6
6
  from .project.design import *
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  import os
2
4
  from argparse import Namespace
3
5
  from pathlib import Path
@@ -28,11 +30,13 @@ class Info(FlowBase):
28
30
  def import_matplotlib(self):
29
31
  if "MPLCONFIGDIR" not in os.environ:
30
32
  os.environ["MPLCONFIGDIR"] = str(self.builddir.resolve())
33
+ import matplotlib
31
34
  import matplotlib.pyplot as plt
32
- import matplotlib.cm as cm
35
+ from matplotlib import cm
33
36
 
34
37
  self.plt = plt
35
38
  self.cm = cm
39
+ self.colormaps = matplotlib.colormaps
36
40
 
37
41
  @classmethod
38
42
  def parse_args(self, subparsers) -> None:
@@ -75,7 +79,7 @@ class Info(FlowBase):
75
79
  list(set(getattr(n, "parent", None) for n in G.nodes() if getattr(n, "parent", None))),
76
80
  key=lambda p: str(p),
77
81
  )
78
- cmap = self.cm.get_cmap("tab20", len(unique_parents))
82
+ cmap = self.colormaps["tab20"].resampled(len(unique_parents))
79
83
  parent_to_color = {p: cmap(i) for i, p in enumerate(unique_parents)}
80
84
  node_colors = [parent_to_color.get(getattr(n, "parent", None), (0.5, 0.5, 0.5, 1.0)) for n in G.nodes()]
81
85
 
@@ -54,6 +54,10 @@ class Cocotb:
54
54
  raise FileNotFoundError(f"{path}: not found")
55
55
  return path
56
56
 
57
+ def pygpi_entry_point(self) -> str:
58
+ output = sh(["cocotb-config", "--pygpi-entry-point"])
59
+ return output.strip()
60
+
57
61
  def pythonbin(self) -> str:
58
62
  output = sh(["cocotb-config", "--python-bin"])
59
63
  path = Path(output)
@@ -167,16 +171,23 @@ class Cocotb:
167
171
  def env(self) -> dict[str, str]:
168
172
  cocotb_version = Version(version("cocotb"))
169
173
  e = os.environ.copy()
170
- if cocotb_version >= Version("2.0.0"):
174
+ if cocotb_version >= Version("2.1.0"):
175
+ e["COCOTB_TEST_MODULES"] = self.top
176
+ e["COCOTB_TOPLEVEL"] = self.dut
177
+ e["PYGPI_PYTHON_BIN"] = self.pythonbin()
178
+ e["COCOTB_RANDOM_SEED"] = str(self.seed)
179
+ e["GPI_USERS"] = f"{self.libpython()};{self.pygpi_entry_point()}"
180
+ elif cocotb_version >= Version("2.0.0"):
171
181
  e["COCOTB_TEST_MODULES"] = self.top
172
182
  e["COCOTB_TOPLEVEL"] = self.dut
173
183
  e["PYGPI_PYTHON_BIN"] = self.pythonbin()
174
184
  e["COCOTB_RANDOM_SEED"] = str(self.seed)
185
+ e["LIBPYTHON_LOC"] = self.libpython()
175
186
  else:
176
187
  e["MODULE"] = self.top
177
188
  e["TOPLEVEL"] = self.dut
189
+ e["LIBPYTHON_LOC"] = self.libpython()
178
190
  e["PYTHONPYCACHEPREFIX"] = "./pycache"
179
- e["LIBPYTHON_LOC"] = self.libpython()
180
191
  e["GPI_EXTRA"] = ""
181
192
  if self.has_verilog and self.has_vhdl:
182
193
  if self.duttype == VhdlFile:
@@ -1,9 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
- from enum import Enum
4
3
  import logging
4
+ from enum import Enum
5
5
  from pathlib import Path
6
- from typing import TYPE_CHECKING, Callable, Type, Iterable, Generator
6
+ from typing import TYPE_CHECKING, Callable, Generator, Iterable, Type
7
7
  from weakref import WeakValueDictionary
8
8
 
9
9
  if TYPE_CHECKING:
@@ -448,3 +448,7 @@ class SystemRdlFile(File): ...
448
448
 
449
449
  @FileFactory.register(extension=".tcl")
450
450
  class TclFile(File): ...
451
+
452
+
453
+ @FileFactory.register(extension=".j2")
454
+ class Jinja2File(File): ...
@@ -10,6 +10,7 @@ from subprocess import PIPE, STDOUT, Popen
10
10
  from time import sleep
11
11
  from typing import Generator, Union
12
12
 
13
+ import jinja2
13
14
  from jinja2 import Template
14
15
 
15
16
  logger = logging.getLogger(__name__)
@@ -165,3 +166,26 @@ def chdir(directory: Path) -> Generator[Path, None, None]:
165
166
  yield directory
166
167
  finally:
167
168
  os.chdir(old)
169
+
170
+
171
+ def jinja2_copy(src: Path, dest: Path, **kwargs) -> None:
172
+ """
173
+ Copy a file or directory to a destination using Jinja2.
174
+ """
175
+ template_loader = jinja2.FileSystemLoader(searchpath=src.parent)
176
+ template_env = jinja2.Environment(loader=template_loader, undefined=jinja2.StrictUndefined)
177
+
178
+ if src.is_file():
179
+ template = template_env.get_template(src.name)
180
+ text = template.render(**kwargs)
181
+ with src.open("r") as f:
182
+ src_text = f.read()
183
+ if text != src_text:
184
+ logger.debug(f"Render {src} to {dest}")
185
+ else:
186
+ logger.debug(f"Copy {src} to {dest}")
187
+
188
+ with dest.open("w") as f:
189
+ f.write(text)
190
+ else:
191
+ raise ValueError(f"{src} is not a file")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simplhdl
3
- Version: 0.12.1
3
+ Version: 0.13.2
4
4
  Summary: A framework for simulating and implementing HDL designs
5
5
  Author-email: Rasmus Grøndahl Olsen <simplhdl@gmail.com>
6
6
  Maintainer-email: Rasmus Grøndahl Olsen <simplhdl@gmail.com>
@@ -47,6 +47,7 @@ src/simplhdl_icarus/resources/templates/icarus/cmds.f.j2
47
47
  src/simplhdl_icarus/resources/templates/icarus/cocotb.mk.j2
48
48
  src/simplhdl_icarus/resources/templates/icarus/simplhdl_iverilog_dump.v.j2
49
49
  src/simplhdl_icarus/resources/templates/icarus/sources.mk.j2
50
+ src/simplhdl_jinja2/jinja2.py
50
51
  src/simplhdl_lint/__init__.py
51
52
  src/simplhdl_lint/flake8/flake8flow.py
52
53
  src/simplhdl_lint/lint/lintflow.py
@@ -6,6 +6,7 @@ chisel_generator = simplhdl_chisel.chisel:ChiselGenerator
6
6
  encrypt = simplhdl_encrypt.encrypt.encryptflow:EncryptFlow
7
7
  fusersoc_parser = simplhdl_fusesocparser.fusesocparser:FuseSocParser
8
8
  icarus = simplhdl_icarus.icarusflow:IcarusFlow
9
+ jinja2 = simplhdl_jinja2.jinja2:Jinja2Generator
9
10
  lint = simplhdl_lint.lint.lintflow:LintFlow
10
11
  modelsim = simplhdl_modelsim.modelsim.modelsimflow:ModelSimFlow
11
12
  peakrdl_generator = simplhdl_peakrdl.systemrdl:PeakRdlGenerator
@@ -3,6 +3,7 @@ simplhdl_chisel
3
3
  simplhdl_encrypt
4
4
  simplhdl_fusesocparser
5
5
  simplhdl_icarus
6
+ simplhdl_jinja2
6
7
  simplhdl_lint
7
8
  simplhdl_modelsim
8
9
  simplhdl_parser
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import os
5
+
6
+ from simplhdl.plugin import FlowBase, GeneratorBase
7
+ from simplhdl.project.files import Jinja2File
8
+ from simplhdl.utils import jinja2_copy
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class Jinja2Generator(GeneratorBase):
14
+ def run(self, flow: FlowBase):
15
+ files = list(self.project.defaultDesign.files(type=Jinja2File))
16
+ if files:
17
+ logger.debug("Running Jinja2 Generator")
18
+ dest_dir = self.builddir.joinpath("jinja2")
19
+ dest_dir.mkdir(parents=True, exist_ok=True)
20
+
21
+ kwargs = {"os": os}
22
+ for file in files:
23
+ dest_file = dest_dir.joinpath(file.path.name).with_suffix("").resolve()
24
+ jinja2_copy(file.path, dest_file, **kwargs)
25
+ file._path = dest_file
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
4
  import os
3
5
  import shutil
@@ -15,10 +17,10 @@ from simplhdl.project.files import (
15
17
  QuartusQipFile,
16
18
  QuartusQsfFile,
17
19
  SystemVerilogFile,
18
- VerilogIncludeFile,
20
+ UsedIn,
19
21
  VerilogFile,
22
+ VerilogIncludeFile,
20
23
  VhdlFile,
21
- UsedIn,
22
24
  )
23
25
  from simplhdl_encrypt.encrypt.encryptflow import encrypt
24
26
 
@@ -59,25 +61,36 @@ class QuartusExportFlow(ImplementationFlow):
59
61
  self.rootdir = self.directory_root()
60
62
 
61
63
  def directory_root(self):
62
- files = list()
64
+ files = []
63
65
  for file in [f for f in self.project.defaultDesign.files(usedin=UsedIn.IMPLEMENTATION)]:
66
+ resolved = file.path.resolve()
64
67
  if isinstance(file, QuartusQsfFile):
65
68
  continue
66
69
  elif isinstance(file, (ConstraintFile, QuartusQipFile)):
67
70
  pass
68
71
  elif isinstance(file, (HdlSearchPath, QuartusIpFile)):
69
72
  continue
70
- files.append(file.path.resolve())
73
+ # Ignore files generated inside builddir when determining source root
74
+ if not resolved.is_relative_to(self.builddir.resolve()):
75
+ files.append(resolved)
71
76
  return Path(os.path.commonpath(files))
72
77
 
73
78
  def copy_files(self):
74
- seen = dict()
79
+ seen = {}
75
80
  files = [f for f in self.project.defaultDesign.files(usedin=UsedIn.IMPLEMENTATION)]
76
81
  for file in files:
77
82
  fileid = str(file.path.resolve())
78
- dest = self.builddir.joinpath("src", file.path.relative_to(self.rootdir))
83
+ resolved_path = file.path.resolve()
84
+
85
+ # Determine destination based on structure or relative path existence
79
86
  if self.args.structure == "flat":
80
87
  dest = self.builddir.joinpath("src", file.path.name)
88
+ elif resolved_path.is_relative_to(self.rootdir):
89
+ dest = self.builddir.joinpath("src", resolved_path.relative_to(self.rootdir))
90
+ else:
91
+ # Fallback for builddir/generated files outside rootdir
92
+ dest = self.builddir.joinpath("src", file.path.name)
93
+
81
94
  if fileid in seen:
82
95
  file._path = seen.get(fileid)._path
83
96
  continue
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
+ import os
4
5
  import re
5
6
  from pathlib import Path
6
7
  from shutil import copy, copytree, ignore_patterns, rmtree
@@ -28,11 +29,11 @@ from simplhdl.project.files import (
28
29
  QuartusQsysZipFile,
29
30
  SdcFile,
30
31
  SystemVerilogFile,
32
+ UsedIn,
31
33
  VerilogFile,
32
34
  VhdlFile,
33
- UsedIn,
34
35
  )
35
- from simplhdl.utils import md5check, md5write, sh
36
+ from simplhdl.utils import jinja2_copy, md5check, md5write, sh
36
37
 
37
38
  logger = logging.getLogger(__name__)
38
39
 
@@ -322,9 +323,9 @@ def copy_ipfile(file: QuartusIpFile, dest: Path) -> QuartusIpFile:
322
323
  md5write(file.path, srcdir, filename=md5file)
323
324
  else:
324
325
  if not md5file.exists() or not md5check(file.path, filename=md5file):
325
- logger.debug(f"Copy {file.path} to {destfile}")
326
326
  rmtree(destdir, ignore_errors=True)
327
- copy(str(file.path), str(destfile))
327
+ kwargs = {"os": os}
328
+ jinja2_copy(file.path, destfile, **kwargs)
328
329
  md5write(file.path, filename=md5file)
329
330
  file.__class__ = QuartusIpFile
330
331
  file._path = destfile.resolve()
@@ -59,19 +59,28 @@ class VivadoExportFlow(ImplementationFlow):
59
59
  def directory_root(self):
60
60
  files = []
61
61
  for file in [f for f in self.project.defaultDesign.files(usedin=UsedIn.IMPLEMENTATION)]:
62
- if isinstance(file, (ConstraintFile)):
63
- pass
64
- files.append(file.path.resolve())
65
- return Path(os.path.commonpath(files))
62
+ resolved = file.path.resolve()
63
+ # Ignore files generated inside builddir when determining source root
64
+ if not resolved.is_relative_to(self.builddir.resolve()):
65
+ files.append(resolved)
66
+ return Path(os.path.commonpath(files)) if files else self.builddir
66
67
 
67
68
  def copy_files(self):
68
69
  seen = {}
69
70
  files = [f for f in self.project.defaultDesign.files(usedin=UsedIn.IMPLEMENTATION)]
70
71
  for file in files:
71
72
  fileid = str(file.path.resolve())
72
- dest = self.builddir.joinpath("src", file.path.relative_to(self.rootdir))
73
+ resolved_path = file.path.resolve()
74
+
75
+ # Determine destination based on structure or relative path existence
73
76
  if self.args.structure == "flat":
74
77
  dest = self.builddir.joinpath("src", file.path.name)
78
+ elif resolved_path.is_relative_to(self.rootdir):
79
+ dest = self.builddir.joinpath("src", resolved_path.relative_to(self.rootdir))
80
+ else:
81
+ # Fallback for builddir/generated files outside rootdir
82
+ dest = self.builddir.joinpath("src", file.path.name)
83
+
75
84
  if fileid in seen:
76
85
  file._path = seen.get(fileid)._path
77
86
  continue
@@ -93,6 +102,7 @@ class VivadoExportFlow(ImplementationFlow):
93
102
  else:
94
103
  dest.parent.mkdir(parents=True, exist_ok=True)
95
104
  shutil.copyfile(file.path, dest)
105
+
96
106
  # Convert to relative path
97
107
  file._path = dest
98
108
  seen[fileid] = file
File without changes
File without changes
File without changes
File without changes