SimplHDL 0.5.8__tar.gz → 0.6.0__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 (204) hide show
  1. {simplhdl-0.5.8 → simplhdl-0.6.0}/PKG-INFO +3 -1
  2. {simplhdl-0.5.8 → simplhdl-0.6.0}/pyproject.toml +2 -0
  3. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/SimplHDL.egg-info/PKG-INFO +3 -1
  4. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/SimplHDL.egg-info/SOURCES.txt +1 -0
  5. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/SimplHDL.egg-info/requires.txt +2 -0
  6. simplhdl-0.6.0/src/simplhdl/__init__.py +1 -0
  7. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/simulationflow.py +1 -0
  8. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/vcs/vcsflow.py +13 -4
  9. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/generators/ipxact.py +8 -3
  10. simplhdl-0.6.0/src/simplhdl/generators/systemrdl.py +202 -0
  11. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/pyedaa/__init__.py +15 -0
  12. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/pyedaa/design.py +6 -0
  13. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/questasim/project.qrun.j2 +2 -1
  14. simplhdl-0.6.0/src/simplhdl/resources/templates/vcs/simv-run.do.j2 +6 -0
  15. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vivado/project.tcl.j2 +12 -1
  16. simplhdl-0.5.8/src/simplhdl/__init__.py +0 -1
  17. simplhdl-0.5.8/src/simplhdl/generators/systemrdl.py +0 -27
  18. {simplhdl-0.5.8 → simplhdl-0.6.0}/.github/workflows/publish.yml +0 -0
  19. {simplhdl-0.5.8 → simplhdl-0.6.0}/.gitignore +0 -0
  20. {simplhdl-0.5.8 → simplhdl-0.6.0}/.readthedocs.yaml +0 -0
  21. {simplhdl-0.5.8 → simplhdl-0.6.0}/LICENSE +0 -0
  22. {simplhdl-0.5.8 → simplhdl-0.6.0}/README.md +0 -0
  23. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/_static/simplhdl_dark.png +0 -0
  24. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/_static/simplhdl_light.png +0 -0
  25. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/_static/simplhdl_light_1.png +0 -0
  26. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/conf.py +0 -0
  27. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/drawing.svg +0 -0
  28. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/flows/ghdl.rst +0 -0
  29. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/flows/icarus.rst +0 -0
  30. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/flows/quartus.rst +0 -0
  31. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/flows/questasim.rst +0 -0
  32. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/flows/vcs.rst +0 -0
  33. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/flows/vivado.rst +0 -0
  34. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/flows/xsim.rst +0 -0
  35. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/flows.rst +0 -0
  36. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/index.rst +0 -0
  37. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/intel-ips.md +0 -0
  38. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/introduction.rst +0 -0
  39. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/plugins.rst +0 -0
  40. {simplhdl-0.5.8 → simplhdl-0.6.0}/docs/requirements.txt +0 -0
  41. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/adder/adder.yml +0 -0
  42. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/adder/hdl/adder.sv +0 -0
  43. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/adder/sim/testbench.sv +0 -0
  44. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/adder/sim/testbench.yml +0 -0
  45. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/adder/syn/build.yml +0 -0
  46. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/adder/syn/placement.xdc +0 -0
  47. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/adder/syn/timing.xdc +0 -0
  48. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/adder/syn/top.sv +0 -0
  49. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/alu.yml +0 -0
  50. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/hdl/add.sv +0 -0
  51. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/hdl/alu.sv +0 -0
  52. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/hdl/mul.sv +0 -0
  53. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/hdl/sub.sv +0 -0
  54. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/alu_vip/__init__.py +0 -0
  55. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/alu_vip/agent.py +0 -0
  56. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/alu_vip/aluif.py +0 -0
  57. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/alu_vip/driver.py +0 -0
  58. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/alu_vip/monitor.py +0 -0
  59. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/alu_vip/sequenceitem.py +0 -0
  60. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/alu_vip/sequencer.py +0 -0
  61. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/clock_vip/__init__.py +0 -0
  62. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/clock_vip/agent.py +0 -0
  63. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/clock_vip/clockif.py +0 -0
  64. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/pyuvm.yml +0 -0
  65. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/test/__init__.py +0 -0
  66. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/test/env.py +0 -0
  67. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/test/seq_lib.py +0 -0
  68. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/test/test.py +0 -0
  69. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/pyuvm/testbench.py +0 -0
  70. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/alu_vip/agent.svh +0 -0
  71. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/alu_vip/alu_vip.sv +0 -0
  72. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/alu_vip/alu_vip.yml +0 -0
  73. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/alu_vip/driver.svh +0 -0
  74. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/alu_vip/env.svh +0 -0
  75. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/alu_vip/monitor.svh +0 -0
  76. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/alu_vip/sequence_item.svh +0 -0
  77. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/tb_env/seq_lib/add_seq.svh +0 -0
  78. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/tb_env/seq_lib/base_seq.svh +0 -0
  79. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/tb_env/tb_env.sv +0 -0
  80. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/tb_env/tb_env.yml +0 -0
  81. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/tb_env/test/base_test.svh +0 -0
  82. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/tb_env/test/test_add.svh +0 -0
  83. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/testbench/alu_if.sv +0 -0
  84. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/testbench/testbench.sv +0 -0
  85. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/testbench/testbench.yml +0 -0
  86. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/sim/uvm/testcases/test_add/test_add.yml +0 -0
  87. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/syn/build.yml +0 -0
  88. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/syn/placement.xdc +0 -0
  89. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/alu/syn/timing.xdc +0 -0
  90. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/hello/build.sbt +0 -0
  91. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/hello/hello.yml +0 -0
  92. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/hello/src/main/scala/Hello.scala +0 -0
  93. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/hdl/hello/syn/build.yml +0 -0
  94. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/plugins/simple_parser/setup.py +0 -0
  95. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/plugins/simple_parser/src/simple_parser/__init__.py +0 -0
  96. {simplhdl-0.5.8 → simplhdl-0.6.0}/examples/plugins/simple_parser/src/simple_parser/simple_parser.py +0 -0
  97. {simplhdl-0.5.8 → simplhdl-0.6.0}/setup.cfg +0 -0
  98. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/SimplHDL.egg-info/dependency_links.txt +0 -0
  99. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/SimplHDL.egg-info/entry_points.txt +0 -0
  100. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/SimplHDL.egg-info/top_level.txt +0 -0
  101. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/__main__.py +0 -0
  102. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/cocotb.py +0 -0
  103. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flow.py +0 -0
  104. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/__init__.py +0 -0
  105. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/encrypt/__init__.py +0 -0
  106. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/encrypt/encryptflow.py +0 -0
  107. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/flake8/flake8flow.py +0 -0
  108. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/implementationflow.py +0 -0
  109. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/lint/lintflow.py +0 -0
  110. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/modelsim/__init__.py +0 -0
  111. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/modelsim/modelsimflow.py +0 -0
  112. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/quartusdse/__init__.py +0 -0
  113. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/quartusdse/quartusdseflow.py +0 -0
  114. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/quartusexport/__init__.py +0 -0
  115. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/quartusexport/quartusexportflow.py +0 -0
  116. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/quartusflow.py +0 -0
  117. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/questasim/__init__.py +0 -0
  118. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/questasim/questasimflow.py +0 -0
  119. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/rivierapro/__init__.py +0 -0
  120. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/rivierapro/rivieraproflow.py +0 -0
  121. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/vcs/__init__.py +0 -0
  122. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/verible/__init__.py +0 -0
  123. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/verible/veribleflow.py +0 -0
  124. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/vivadoflow.py +0 -0
  125. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/vsg/__init__.py +0 -0
  126. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/vsg/vsgflow.py +0 -0
  127. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/xsim/__init__.py +0 -0
  128. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/flows/xsim/xsimflow.py +0 -0
  129. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/generator.py +0 -0
  130. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/generators/__init__.py +0 -0
  131. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/generators/chisel.py +0 -0
  132. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/generators/spd.py +0 -0
  133. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/info.py +0 -0
  134. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/parser.py +0 -0
  135. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/parsers/__init__.py +0 -0
  136. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/parsers/fusesocparser.py +0 -0
  137. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/parsers/simplhdlparser.py +0 -0
  138. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/plugins.py +0 -0
  139. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/pyedaa/attributes.py +0 -0
  140. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/pyedaa/fileset.py +0 -0
  141. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/pyedaa/filetypes.py +0 -0
  142. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/pyedaa/project.py +0 -0
  143. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/pyedaa/target.py +0 -0
  144. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/pyedaa/vhdllibrary.py +0 -0
  145. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/repo.py +0 -0
  146. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/__init__.py +0 -0
  147. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/__init__.py +0 -0
  148. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/flake8/__init__.py +0 -0
  149. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/flake8/setup.cfg.j2 +0 -0
  150. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/modelsim/Makefile.j2 +0 -0
  151. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/modelsim/__init__.py +0 -0
  152. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/modelsim/cocotb.mk.j2 +0 -0
  153. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/modelsim/dependencies.mk.j2 +0 -0
  154. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/modelsim/files.j2 +0 -0
  155. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/modelsim/fileset.j2 +0 -0
  156. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/modelsim/modelsim.tcl.j2 +0 -0
  157. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/modelsim/project.mk.j2 +0 -0
  158. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/modelsim/run.do.j2 +0 -0
  159. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/quartus/__init__.py +0 -0
  160. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/quartus/project.tcl.j2 +0 -0
  161. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/quartus/run.tcl.j2 +0 -0
  162. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/questasim/__init__.py +0 -0
  163. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/questasim/modelsim.tcl.j2 +0 -0
  164. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/questasim/visualizer.tcl.j2 +0 -0
  165. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/questasim/vsim-run.do.j2 +0 -0
  166. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/rivierapro/Makefile.j2 +0 -0
  167. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/rivierapro/__init__.py +0 -0
  168. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/rivierapro/cocotb.mk.j2 +0 -0
  169. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/rivierapro/dependencies.mk.j2 +0 -0
  170. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/rivierapro/files.j2 +0 -0
  171. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/rivierapro/fileset.j2 +0 -0
  172. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/rivierapro/project.mk.j2 +0 -0
  173. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vcs/Makefile.j2 +0 -0
  174. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vcs/__init__.py +0 -0
  175. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vcs/cocotb.mk.j2 +0 -0
  176. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vcs/dependencies.mk.j2 +0 -0
  177. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vcs/files.j2 +0 -0
  178. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vcs/fileset.j2 +0 -0
  179. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vcs/pli.tab.j2 +0 -0
  180. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vcs/project.mk.j2 +0 -0
  181. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vcs/synopsys_sim.setup.j2 +0 -0
  182. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vcs/vcs.parameters.j2 +0 -0
  183. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/verible/__init__.py +0 -0
  184. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/verible/rules.cfg.j2 +0 -0
  185. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vivado/__init__.py +0 -0
  186. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vivado/launch_run.sh.j2 +0 -0
  187. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vivado/run.tcl.j2 +0 -0
  188. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vivado/steps.tcl.j2 +0 -0
  189. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vsg/__init__.py +0 -0
  190. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vsg/files.json.j2 +0 -0
  191. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/vsg/rules.yml.j2 +0 -0
  192. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/xsim/Makefile.j2 +0 -0
  193. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/xsim/__init__.py +0 -0
  194. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/xsim/cocotb.mk.j2 +0 -0
  195. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/xsim/dependencies.mk.j2 +0 -0
  196. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/xsim/files.j2 +0 -0
  197. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/xsim/fileset.j2 +0 -0
  198. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/resources/templates/xsim/project.mk.j2 +0 -0
  199. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/run.py +0 -0
  200. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/simplhdl.py +0 -0
  201. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/tools.py +0 -0
  202. {simplhdl-0.5.8 → simplhdl-0.6.0}/src/simplhdl/utils.py +0 -0
  203. {simplhdl-0.5.8 → simplhdl-0.6.0}/tests/test_dummy.py +0 -0
  204. {simplhdl-0.5.8 → simplhdl-0.6.0}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SimplHDL
3
- Version: 0.5.8
3
+ Version: 0.6.0
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>
@@ -56,6 +56,8 @@ Requires-Dist: rich
56
56
  Requires-Dist: vsg
57
57
  Requires-Dist: flake8
58
58
  Requires-Dist: black
59
+ Requires-Dist: systemrdl-compiler
60
+ Requires-Dist: peakrdl-html
59
61
  Dynamic: license-file
60
62
 
61
63
  ## Introduction
@@ -24,6 +24,8 @@ dependencies = [
24
24
  "vsg",
25
25
  "flake8",
26
26
  "black",
27
+ "systemrdl-compiler",
28
+ "peakrdl-html",
27
29
  ]
28
30
  requires-python = ">=3.8"
29
31
  authors = [
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SimplHDL
3
- Version: 0.5.8
3
+ Version: 0.6.0
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>
@@ -56,6 +56,8 @@ Requires-Dist: rich
56
56
  Requires-Dist: vsg
57
57
  Requires-Dist: flake8
58
58
  Requires-Dist: black
59
+ Requires-Dist: systemrdl-compiler
60
+ Requires-Dist: peakrdl-html
59
61
  Dynamic: license-file
60
62
 
61
63
  ## Introduction
@@ -177,6 +177,7 @@ src/simplhdl/resources/templates/vcs/files.j2
177
177
  src/simplhdl/resources/templates/vcs/fileset.j2
178
178
  src/simplhdl/resources/templates/vcs/pli.tab.j2
179
179
  src/simplhdl/resources/templates/vcs/project.mk.j2
180
+ src/simplhdl/resources/templates/vcs/simv-run.do.j2
180
181
  src/simplhdl/resources/templates/vcs/synopsys_sim.setup.j2
181
182
  src/simplhdl/resources/templates/vcs/vcs.parameters.j2
182
183
  src/simplhdl/resources/templates/verible/__init__.py
@@ -9,6 +9,8 @@ rich
9
9
  vsg
10
10
  flake8
11
11
  black
12
+ systemrdl-compiler
13
+ peakrdl-html
12
14
 
13
15
  [:python_version < "3.9"]
14
16
  importlib-resources
@@ -0,0 +1 @@
1
+ __version__ = "0.6.0"
@@ -73,6 +73,7 @@ class SimulationFlow(FlowBase):
73
73
  globals['VHDLSourceFile'] = VHDLSourceFile
74
74
  globals['UsedIn'] = UsedIn
75
75
  globals['uvm'] = self.is_uvm()
76
+ globals['isinstance'] = isinstance
76
77
  return globals
77
78
 
78
79
  def generate(self):
@@ -34,9 +34,11 @@ class VcsFlow(SimulationFlow):
34
34
  )
35
35
  parser.add_argument(
36
36
  '-w',
37
- '--wave',
38
- action='store_true',
39
- help="Dump waveforms"
37
+ '--wavedump',
38
+ nargs='?',
39
+ const='vpd',
40
+ choices=['vpd', 'evcd', 'fsdb'],
41
+ help="Dump waveforms using vpd, evcd or fsdb format"
40
42
  )
41
43
  parser.add_argument(
42
44
  '--gui',
@@ -92,6 +94,7 @@ class VcsFlow(SimulationFlow):
92
94
 
93
95
  def get_globals(self) -> Dict[str, Any]:
94
96
  globals = super().get_globals()
97
+ globals['wavedump'] = self.args.wavedump
95
98
  globals['vlogan_args'] = self.vlogan_args()
96
99
  globals['vhdlan_args'] = self.vhdlan_args()
97
100
  globals['vcs_args'] = self.vcs_args()
@@ -124,6 +127,8 @@ class VcsFlow(SimulationFlow):
124
127
  environment.get_template('synopsys_sim.setup.j2'),
125
128
  environment.get_template('project.mk.j2'),
126
129
  environment.get_template('vcs.parameters.j2'),
130
+ environment.get_template('simv-run.do.j2'),
131
+
127
132
  ]
128
133
 
129
134
  def get_cocotb_templates(self, environment):
@@ -179,7 +184,7 @@ class VcsFlow(SimulationFlow):
179
184
  args.add(f"-timescale={self.args.timescale}")
180
185
  if self.is_uvm():
181
186
  args.add('-ntb_opts uvm')
182
- if self.args.gui:
187
+ if self.args.gui or self.args.wavedump:
183
188
  args.add('-debug_access+all')
184
189
  if self.is_verdi():
185
190
  args.add('-kdb')
@@ -195,6 +200,10 @@ class VcsFlow(SimulationFlow):
195
200
  args.add(f"+ntb_random_seed={self.args.seed}")
196
201
  for name, value in self.project.PlusArgs.items():
197
202
  args.add(f"+{name}={escape(value)}")
203
+ if self.args.wavedump == 'vpd':
204
+ args.add('-ucli -do simv-run.do')
205
+ if self.args.wavedump == 'evcd' or self.args.wavedump == 'fsdb':
206
+ raise NotImplementedError(f"Wavedump for {self.args.wavedump} format is not yet implemented")
198
207
  return ' '.join(list(args) + [self.args.simv_args])
199
208
 
200
209
  def get_library(self, fileset: FileSet) -> str:
@@ -17,7 +17,7 @@ from ..pyedaa.vhdllibrary import VHDLLibrary
17
17
  from ..pyedaa import (
18
18
  File, SystemVerilogSourceFile, TCLSourceFile, ConstraintFile, HDLSourceFile,
19
19
  VHDLSourceFile, VerilogSourceFile, VivadoIPSpecificationFile,
20
- VerilogIncludeFile
20
+ VerilogIncludeFile, SystemCSourceFile, SystemCHeaderFile
21
21
  )
22
22
 
23
23
  logger = logging.getLogger(__name__)
@@ -40,6 +40,8 @@ FILETYPE_2014_MAP = {
40
40
  '.tcl': TCLSourceFile,
41
41
  'SDC': ConstraintFile,
42
42
  '.sdc': ConstraintFile,
43
+ 'systemCSource': SystemCSourceFile,
44
+ 'systemCSourceInclude': SystemCHeaderFile,
43
45
  'unknown': File,
44
46
  }
45
47
 
@@ -191,7 +193,7 @@ class VivadoIP(GeneratorBase):
191
193
  file = component.filepath(file_element).with_suffix('.xml')
192
194
  if file.exists():
193
195
  files += self.get_files(file)
194
- for view in component.views('.*simulation.*'):
196
+ for view in component.views('.*(verilog|vhdl)simulation.*'):
195
197
  filesets = component.filesets(view)
196
198
  for fileset in filesets:
197
199
  files += component.pyedaa_files(fileset)
@@ -217,6 +219,9 @@ class VivadoIP(GeneratorBase):
217
219
  i += 1
218
220
  filesets.append(fileset)
219
221
  last_lib = file.Library.Name
220
- fileset.AddFile(file)
222
+ try:
223
+ fileset.AddFile(file)
224
+ except Exception:
225
+ logger.warning(f"Failed to add {file.Path}")
221
226
  for fileset in filesets:
222
227
  newipfile.FileSet._fileSets[fileset.Name] = fileset
@@ -0,0 +1,202 @@
1
+ import os
2
+ import logging
3
+ import jinja2
4
+
5
+ from typing import List
6
+ from pathlib import Path
7
+ from systemrdl import RDLCompiler, RDLCompileError, RDLListener, RDLWalker
8
+ from systemrdl.node import AddrmapNode
9
+ from systemrdl.rdltypes import AccessType, OnReadType, OnWriteType
10
+ from peakrdl_html import HTMLExporter
11
+
12
+ from ..generator import GeneratorFactory, GeneratorBase
13
+ from ..pyedaa import SystemRDLSourceFile, SystemVerilogSourceFile, VerilogSourceFile
14
+ from ..flow import FlowBase
15
+
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+ seennodes: List[AddrmapNode] = []
20
+ addrmapnodes: List[AddrmapNode] = []
21
+ hierachymapnodes: List[AddrmapNode] = []
22
+
23
+
24
+ class Environment(jinja2.Environment):
25
+ def find_template(self, name):
26
+ list = [i for i in self.list_templates() if i.startswith(name)]
27
+ if len(list) == 0:
28
+ raise jinja2.TemplateNotFound(name)
29
+ if len(list) > 1:
30
+ logger.warning(f"Multiple templates found ({list}) for {name}")
31
+ return self.get_template(list[0])
32
+
33
+
34
+ class Listener(RDLListener):
35
+ def exit_Addrmap(self, node: AddrmapNode):
36
+ seen = [n for n in seennodes if n.type_name == node.type_name]
37
+ if not seen:
38
+ seennodes.append(node)
39
+ if AddrmapNode not in [type(c) for c in node.children()]:
40
+ addrmapnodes.append(node)
41
+ else:
42
+ hierachymapnodes.append(node)
43
+
44
+
45
+ def get_template_dirs() -> List[Path]:
46
+ string = os.getenv('SIMPLHDL_SYSTEMRDL_TEMPLATES')
47
+ if string:
48
+ templates = [Path(p) for p in string.split(':')]
49
+ for t in templates:
50
+ if not t.is_dir():
51
+ logger.error(f"Directory {t} does not exist")
52
+ raise SystemError
53
+ else:
54
+ logger.error("SIMPLHDL_SYSTEMRDL_TEMPLATES is not set, no templates found")
55
+ raise SystemError
56
+ return templates
57
+
58
+
59
+ def get_reg_access(reg) -> str:
60
+ if reg.has_sw_readable and reg.has_sw_writable:
61
+ return "RW"
62
+ elif reg.has_sw_writable:
63
+ return "WO"
64
+ elif reg.has_sw_readable:
65
+ return "RO"
66
+ else:
67
+ return "RW"
68
+
69
+
70
+ def get_field_access(field) -> str: # noqa: C901
71
+ """
72
+ Get field's UVM access string
73
+ """
74
+ sw = field.get_property("sw")
75
+ onread = field.get_property("onread")
76
+ onwrite = field.get_property("onwrite")
77
+
78
+ if sw == AccessType.rw:
79
+ if (onwrite is None) and (onread is None):
80
+ return "RW"
81
+ elif (onread == OnReadType.rclr) and (onwrite == OnWriteType.woset):
82
+ return "W1SRC"
83
+ elif (onread == OnReadType.rclr) and (onwrite == OnWriteType.wzs):
84
+ return "W0SRC"
85
+ elif (onread == OnReadType.rclr) and (onwrite == OnWriteType.wset):
86
+ return "WSRC"
87
+ elif (onread == OnReadType.rset) and (onwrite == OnWriteType.woclr):
88
+ return "W1CRS"
89
+ elif (onread == OnReadType.rset) and (onwrite == OnWriteType.wzc):
90
+ return "W0CRS"
91
+ elif (onread == OnReadType.rset) and (onwrite == OnWriteType.wclr):
92
+ return "WCRS"
93
+ elif onwrite == OnWriteType.woclr:
94
+ return "W1C"
95
+ elif onwrite == OnWriteType.woset:
96
+ return "W1S"
97
+ elif onwrite == OnWriteType.wot:
98
+ return "W1T"
99
+ elif onwrite == OnWriteType.wzc:
100
+ return "W0C"
101
+ elif onwrite == OnWriteType.wzs:
102
+ return "W0S"
103
+ elif onwrite == OnWriteType.wzt:
104
+ return "W0T"
105
+ elif onwrite == OnWriteType.wclr:
106
+ return "WC"
107
+ elif onwrite == OnWriteType.wset:
108
+ return "WS"
109
+ elif onread == OnReadType.rclr:
110
+ return "WRC"
111
+ elif onread == OnReadType.rset:
112
+ return "WRS"
113
+ else:
114
+ return "RW"
115
+
116
+ elif sw == AccessType.r:
117
+ if onread is None:
118
+ return "RO"
119
+ elif onread == OnReadType.rclr:
120
+ return "RC"
121
+ elif onread == OnReadType.rset:
122
+ return "RS"
123
+ else:
124
+ return "RO"
125
+
126
+ elif sw == AccessType.w:
127
+ if onwrite is None:
128
+ return "WO"
129
+ elif onwrite == OnWriteType.wclr:
130
+ return "WOC"
131
+ elif onwrite == OnWriteType.wset:
132
+ return "WOS"
133
+ else:
134
+ return "WO"
135
+
136
+ elif sw == AccessType.rw1:
137
+ return "W1"
138
+
139
+ elif sw == AccessType.w1:
140
+ return "WO1"
141
+
142
+ else:
143
+ return "NOACCESS"
144
+
145
+
146
+ @GeneratorFactory.register('SystemRDL')
147
+ class SystemRDL(GeneratorBase):
148
+
149
+ def render_template(self, template, node, outputdir) -> Path:
150
+ context = template.render(node=node)
151
+ outputdir.mkdir(parents=True, exist_ok=True)
152
+ outputfile: Path = outputdir.joinpath(f'{node.type_name}__{Path(template.filename).name[:-3]}').absolute()
153
+ with outputfile.open('w') as f:
154
+ f.write(context)
155
+ rdlfile = self.project.DefaultDesign.GetFile(node.inst.def_src_ref.path)
156
+ fileset = rdlfile.FileSet
157
+ if outputfile.suffix == '.sv':
158
+ fileset.InsertFileAfter(rdlfile, SystemVerilogSourceFile(outputfile))
159
+ if outputfile.suffix == '.v':
160
+ fileset.InsertFileAfter(rdlfile, VerilogSourceFile(outputfile))
161
+
162
+ def run(self, flow: FlowBase):
163
+ rdlfiles = list(self.project.DefaultDesign.DefaultFileSet.Files(fileType=SystemRDLSourceFile))
164
+ output_dir = self.builddir.joinpath('systemrdl')
165
+
166
+ if not rdlfiles:
167
+ return
168
+
169
+ rdlc = RDLCompiler()
170
+ try:
171
+ for rdlfile in rdlfiles:
172
+ rdlc.compile_file(rdlfile.Path, defines=self.project.Defines)
173
+ root = rdlc.elaborate()
174
+ except RDLCompileError as e:
175
+ logger.error(str(e))
176
+ raise SystemError
177
+
178
+ walker = RDLWalker()
179
+ walker.walk(root, Listener())
180
+
181
+ templatedirs = get_template_dirs()
182
+
183
+ for templatedir in templatedirs:
184
+ logger.info(f"Generate from template {templatedir}")
185
+ sub_dir = output_dir.joinpath(templatedir.name)
186
+
187
+ env = Environment(
188
+ loader=jinja2.FileSystemLoader(templatedir),
189
+ trim_blocks=True)
190
+ env.globals['hex'] = hex
191
+ env.globals['get_field_access'] = get_field_access
192
+ env.globals['get_reg_access'] = get_reg_access
193
+ template = env.find_template('registermap')
194
+ for node in addrmapnodes:
195
+ self.render_template(template=template, node=node, outputdir=sub_dir)
196
+
197
+ template = env.find_template('hierachymap')
198
+ for node in hierachymapnodes:
199
+ self.render_template(template=template, node=node, outputdir=sub_dir)
200
+
201
+ logger.info("Generate HTML Documentation")
202
+ _ = HTMLExporter().export(root, output_dir.joinpath('docs'))
@@ -144,10 +144,25 @@ class EDIFNetlistFile(pm.EDIFNetlistFile, FileMixIn):
144
144
  FileMixIn._registerAttributes(self)
145
145
 
146
146
 
147
+ class CHeaderFile(SourceFile):
148
+ def _registerAttributes(self):
149
+ super()._registerAttributes()
150
+ self[UsedIn] = {SIMULATION}
151
+
152
+
147
153
  class CSourceFile(pm.CSourceFile, FileMixIn):
148
154
  def _registerAttributes(self):
149
155
  super()._registerAttributes()
150
156
  FileMixIn._registerAttributes(self)
157
+ self[UsedIn] = {SIMULATION}
158
+
159
+
160
+ class SystemCSourceFile(CSourceFile):
161
+ pass
162
+
163
+
164
+ class SystemCHeaderFile(CHeaderFile):
165
+ pass
151
166
 
152
167
 
153
168
  class SettingFile(pm.SettingFile, FileMixIn):
@@ -3,6 +3,7 @@ import pyEDAA.ProjectModel as pm
3
3
  from pathlib import Path
4
4
  from typing import Dict, Union, Generator
5
5
 
6
+ from . import File
6
7
  from .vhdllibrary import VHDLLibrary
7
8
 
8
9
 
@@ -82,3 +83,8 @@ class Design(pm.Design):
82
83
  continue
83
84
  seen.append(fileid)
84
85
  yield file
86
+
87
+ def GetFile(self, path: Path) -> File:
88
+ for file in self.Files():
89
+ if file.Path.absolute() == path.absolute():
90
+ return file
@@ -20,7 +20,8 @@
20
20
  {% for fileset in filesets %}
21
21
  -makelib {{fileset.VHDLLibrary.Name}}:{{fileset.VHDLLibrary.Path}}
22
22
  {% for file in fileset.GetFiles() %}
23
- {% if file.FileType in [SystemVerilogSourceFile, VerilogSourceFile, VHDLSourceFile] and 'simulation' in file[UsedIn] %}
23
+
24
+ {% if isinstance(file, (SystemVerilogSourceFile, VerilogSourceFile, VHDLSourceFile)) and 'simulation' in file[UsedIn] %}
24
25
  {{file.Path}}
25
26
  {% endif %}
26
27
  {% endfor %}
@@ -0,0 +1,6 @@
1
+ {% if wavedump is not none %}
2
+ set fid [dump -file waves.{{wavedump}} -type {{wavedump.upper()}}]
3
+ dump -add . -aggregates -fid $fid
4
+ {% endif %}
5
+ run
6
+ quit
@@ -6,6 +6,17 @@ proc source_script {filename} {
6
6
  }
7
7
  }
8
8
 
9
+
10
+ proc source_bd_script {filename} {
11
+ # Fail if bd script return an error code or a non zero value
12
+ if {[catch {source -notrace $filename} err]} {
13
+ return -code 1
14
+ } elseif {$err != 0} {
15
+ return -code 1
16
+ }
17
+ }
18
+
19
+
9
20
  proc source_step_script {filename} {
10
21
  # NOTE: make get_files fail if not files are found
11
22
  set_msg_config -id {Vivado 12-818} -new_severity {ERROR}
@@ -101,7 +112,7 @@ read_edif "{{file.Path|replace('\\', '/')}}"
101
112
  read_bd "{{file.Path|replace('\\', '/')}}"
102
113
  {% elif file.FileType == VivadoBDTclFile %}
103
114
  send_msg_id {SimplHDL PRJ-3} {INFO} "Sourcing BD tcl file {{file.Path|replace('\\', '/')}}: this might take some time."
104
- source_script "{{file.Path|replace('\\', '/')}}"
115
+ source_bd_script "{{file.Path|replace('\\', '/')}}"
105
116
  {% elif file.FileType == VivadoProjectStepFile %}
106
117
  add_files -fileset utils_1 "{{file.Path|replace('\\', '/')}}"
107
118
  global step
@@ -1 +0,0 @@
1
- __version__ = "0.5.8"
@@ -1,27 +0,0 @@
1
- import logging
2
-
3
- from ..generator import GeneratorFactory, GeneratorBase
4
- from ..pyedaa import SystemRDLSourceFile, SystemVerilogSourceFile
5
- from ..flow import FlowBase
6
- from ..utils import sh
7
-
8
- logger = logging.getLogger(__name__)
9
-
10
-
11
- @GeneratorFactory.register('SystemRDL')
12
- class SystemRDL(GeneratorBase):
13
-
14
- def run(self, flow: FlowBase):
15
- rdlfiles = self.project.DefaultDesign.DefaultFileSet.Files(fileType=SystemRDLSourceFile)
16
- output_dir = self.builddir.joinpath('systemrdl')
17
-
18
- for rdlfile in rdlfiles:
19
- logger.debug("Running SystemRDL Generator")
20
- output_dir.mkdir(exist_ok=True)
21
- sh(f'peakrdl regblock {rdlfile.Path} -o {output_dir} --cpuif axi4-lite'.split())
22
- pkgfile = SystemVerilogSourceFile(output_dir.joinpath(f'{rdlfile.Path.stem}_pkg.sv'))
23
- svfile = SystemVerilogSourceFile(output_dir.joinpath(f'{rdlfile.Path.stem}.sv'))
24
- rdlfile.FileSet.InsertFileAfter(rdlfile, pkgfile)
25
- rdlfile.FileSet.InsertFileAfter(rdlfile, svfile)
26
- # NOTE: After inserting files call next to prevent infinit iterations
27
- next(rdlfiles)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes