rggen 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (269) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +54 -29
  3. data/{LICENSE.txt → LICENSE} +1 -1
  4. data/README.md +65 -56
  5. data/lib/rggen.rb +4 -63
  6. data/lib/rggen/built_in.rb +53 -0
  7. data/lib/rggen/built_in/bit_field/bit_assignment.rb +108 -0
  8. data/lib/rggen/built_in/bit_field/comment.rb +16 -0
  9. data/lib/rggen/built_in/bit_field/initial_value.rb +45 -0
  10. data/lib/rggen/built_in/bit_field/name.rb +39 -0
  11. data/lib/rggen/built_in/bit_field/reference.rb +100 -0
  12. data/lib/rggen/built_in/bit_field/sv_rtl_top.rb +87 -0
  13. data/lib/rggen/built_in/bit_field/type.rb +279 -0
  14. data/lib/rggen/built_in/bit_field/type/rc_w0c_w1c.erb +15 -0
  15. data/lib/rggen/built_in/bit_field/type/rc_w0c_w1c.rb +68 -0
  16. data/lib/rggen/built_in/bit_field/type/reserved.erb +3 -0
  17. data/lib/rggen/built_in/bit_field/type/reserved.rb +16 -0
  18. data/lib/rggen/built_in/bit_field/type/ro.erb +6 -0
  19. data/lib/rggen/built_in/bit_field/type/ro.rb +34 -0
  20. data/lib/rggen/built_in/bit_field/type/rof.erb +6 -0
  21. data/lib/rggen/built_in/bit_field/type/rof.rb +17 -0
  22. data/lib/rggen/built_in/bit_field/type/rs_w0s_w1s.erb +13 -0
  23. data/lib/rggen/built_in/bit_field/type/rs_w0s_w1s.rb +52 -0
  24. data/lib/rggen/built_in/bit_field/type/rw_wo.erb +9 -0
  25. data/lib/rggen/built_in/bit_field/type/rw_wo.rb +33 -0
  26. data/lib/rggen/built_in/bit_field/type/rwe_rwl.erb +14 -0
  27. data/lib/rggen/built_in/bit_field/type/rwe_rwl.rb +39 -0
  28. data/lib/rggen/built_in/global/address_width.rb +32 -0
  29. data/lib/rggen/built_in/global/array_port_format.rb +19 -0
  30. data/lib/rggen/built_in/global/bus_width.rb +33 -0
  31. data/lib/rggen/built_in/global/fold_sv_interface_port.rb +24 -0
  32. data/lib/rggen/built_in/register/name.rb +34 -0
  33. data/lib/rggen/built_in/register/offset_address.rb +96 -0
  34. data/lib/rggen/built_in/register/size.rb +49 -0
  35. data/lib/rggen/built_in/register/sv_rtl_top.rb +82 -0
  36. data/lib/rggen/built_in/register/type.rb +374 -0
  37. data/lib/rggen/built_in/register/type/default_sv_ral.erb +8 -0
  38. data/lib/rggen/built_in/register/type/default_sv_rtl.erb +15 -0
  39. data/lib/rggen/built_in/register/type/external.erb +11 -0
  40. data/lib/rggen/built_in/register/type/external.rb +141 -0
  41. data/lib/rggen/built_in/register/type/indirect.rb +329 -0
  42. data/lib/rggen/built_in/register/type/indirect_sv_ral.erb +13 -0
  43. data/lib/rggen/built_in/register/type/indirect_sv_rtl.erb +17 -0
  44. data/lib/rggen/built_in/register_block/byte_size.rb +59 -0
  45. data/lib/rggen/built_in/register_block/name.rb +36 -0
  46. data/lib/rggen/built_in/register_block/protocol.rb +71 -0
  47. data/lib/rggen/built_in/register_block/protocol/apb.erb +10 -0
  48. data/lib/rggen/built_in/register_block/protocol/apb.rb +113 -0
  49. data/lib/rggen/built_in/register_block/protocol/axi4lite.erb +11 -0
  50. data/lib/rggen/built_in/register_block/protocol/axi4lite.rb +167 -0
  51. data/lib/rggen/built_in/register_block/sv_ral_block_model.erb +11 -0
  52. data/lib/rggen/built_in/register_block/sv_ral_package.rb +58 -0
  53. data/lib/rggen/built_in/register_block/sv_rtl_macros.erb +9 -0
  54. data/lib/rggen/built_in/register_block/sv_rtl_top.rb +87 -0
  55. data/lib/rggen/built_in/version.rb +7 -0
  56. data/lib/rggen/default_setup_file.rb +6 -0
  57. data/lib/rggen/setup/default.rb +26 -0
  58. data/lib/rggen/version.rb +5 -4
  59. data/sample/block_0.rb +85 -0
  60. data/sample/block_0.sv +601 -0
  61. data/sample/block_0.xlsx +0 -0
  62. data/sample/block_0.yml +94 -0
  63. data/sample/block_0_ral_pkg.sv +174 -0
  64. data/sample/block_1.rb +22 -0
  65. data/sample/block_1.sv +136 -0
  66. data/sample/block_1.xlsx +0 -0
  67. data/sample/block_1.yml +26 -0
  68. data/sample/block_1_ral_pkg.sv +68 -0
  69. data/sample/config.json +5 -0
  70. data/sample/config.yml +3 -0
  71. metadata +96 -270
  72. data/bin/rggen +0 -6
  73. data/c_header/LICENSE +0 -21
  74. data/c_header/rggen.h +0 -17
  75. data/lib/rggen/base/component.rb +0 -31
  76. data/lib/rggen/base/component_factory.rb +0 -53
  77. data/lib/rggen/base/hierarchical_accessors.rb +0 -87
  78. data/lib/rggen/base/hierarchical_item_accessors.rb +0 -79
  79. data/lib/rggen/base/internal_struct.rb +0 -28
  80. data/lib/rggen/base/item.rb +0 -35
  81. data/lib/rggen/base/item_factory.rb +0 -25
  82. data/lib/rggen/builder/builder.rb +0 -69
  83. data/lib/rggen/builder/category.rb +0 -63
  84. data/lib/rggen/builder/component_entry.rb +0 -50
  85. data/lib/rggen/builder/component_store.rb +0 -42
  86. data/lib/rggen/builder/input_component_store.rb +0 -25
  87. data/lib/rggen/builder/item_store.rb +0 -89
  88. data/lib/rggen/builder/list_item_entry.rb +0 -81
  89. data/lib/rggen/builder/output_component_store.rb +0 -13
  90. data/lib/rggen/builder/simple_item_entry.rb +0 -33
  91. data/lib/rggen/builtins.rb +0 -55
  92. data/lib/rggen/builtins/bit_field/bit_assignment.rb +0 -39
  93. data/lib/rggen/builtins/bit_field/field_model.rb +0 -38
  94. data/lib/rggen/builtins/bit_field/initial_value.rb +0 -36
  95. data/lib/rggen/builtins/bit_field/name.rb +0 -26
  96. data/lib/rggen/builtins/bit_field/reference.rb +0 -40
  97. data/lib/rggen/builtins/bit_field/rtl_top.rb +0 -11
  98. data/lib/rggen/builtins/bit_field/type.rb +0 -244
  99. data/lib/rggen/builtins/bit_field/types/reserved.erb +0 -6
  100. data/lib/rggen/builtins/bit_field/types/reserved.rb +0 -18
  101. data/lib/rggen/builtins/bit_field/types/ro.erb +0 -6
  102. data/lib/rggen/builtins/bit_field/types/ro.rb +0 -22
  103. data/lib/rggen/builtins/bit_field/types/rw.erb +0 -9
  104. data/lib/rggen/builtins/bit_field/types/rw.rb +0 -23
  105. data/lib/rggen/builtins/bit_field/types/rwl_rwe.erb +0 -11
  106. data/lib/rggen/builtins/bit_field/types/rwl_rwe.rb +0 -54
  107. data/lib/rggen/builtins/bit_field/types/w0c_w1c.erb +0 -12
  108. data/lib/rggen/builtins/bit_field/types/w0c_w1c.rb +0 -33
  109. data/lib/rggen/builtins/bit_field/types/w0s_w1s.erb +0 -12
  110. data/lib/rggen/builtins/bit_field/types/w0s_w1s.rb +0 -33
  111. data/lib/rggen/builtins/bit_field/types/wo.rb +0 -5
  112. data/lib/rggen/builtins/global/address_width.rb +0 -17
  113. data/lib/rggen/builtins/global/array_port_format.rb +0 -15
  114. data/lib/rggen/builtins/global/data_width.rb +0 -20
  115. data/lib/rggen/builtins/global/unfold_sv_interface_port.rb +0 -22
  116. data/lib/rggen/builtins/loaders/configuration/json_loader.rb +0 -7
  117. data/lib/rggen/builtins/loaders/configuration/yaml_loader.rb +0 -7
  118. data/lib/rggen/builtins/loaders/register_map/csv_loader.rb +0 -12
  119. data/lib/rggen/builtins/loaders/register_map/xls_loader.rb +0 -17
  120. data/lib/rggen/builtins/loaders/register_map/xlsx_ods_loader.rb +0 -21
  121. data/lib/rggen/builtins/register/array.rb +0 -30
  122. data/lib/rggen/builtins/register/constructor.rb +0 -17
  123. data/lib/rggen/builtins/register/field_model_creator.rb +0 -14
  124. data/lib/rggen/builtins/register/indirect_index_configurator.rb +0 -54
  125. data/lib/rggen/builtins/register/name.rb +0 -26
  126. data/lib/rggen/builtins/register/offset_address.rb +0 -61
  127. data/lib/rggen/builtins/register/reg_model.rb +0 -107
  128. data/lib/rggen/builtins/register/rtl_top.rb +0 -68
  129. data/lib/rggen/builtins/register/sub_block_model.rb +0 -34
  130. data/lib/rggen/builtins/register/type.rb +0 -283
  131. data/lib/rggen/builtins/register/types/default.erb +0 -10
  132. data/lib/rggen/builtins/register/types/external.erb +0 -11
  133. data/lib/rggen/builtins/register/types/external.rb +0 -77
  134. data/lib/rggen/builtins/register/types/indirect.erb +0 -13
  135. data/lib/rggen/builtins/register/types/indirect.rb +0 -175
  136. data/lib/rggen/builtins/register/uniqueness_validator.rb +0 -51
  137. data/lib/rggen/builtins/register_block/address_struct.rb +0 -56
  138. data/lib/rggen/builtins/register_block/base_address.rb +0 -64
  139. data/lib/rggen/builtins/register_block/block_model.rb +0 -20
  140. data/lib/rggen/builtins/register_block/byte_size.rb +0 -37
  141. data/lib/rggen/builtins/register_block/c_header_file.rb +0 -15
  142. data/lib/rggen/builtins/register_block/clock_reset.rb +0 -8
  143. data/lib/rggen/builtins/register_block/constructor.rb +0 -14
  144. data/lib/rggen/builtins/register_block/default_map_creator.rb +0 -39
  145. data/lib/rggen/builtins/register_block/host_if.rb +0 -64
  146. data/lib/rggen/builtins/register_block/host_ifs/apb.erb +0 -10
  147. data/lib/rggen/builtins/register_block/host_ifs/apb.rb +0 -64
  148. data/lib/rggen/builtins/register_block/host_ifs/axi4lite.erb +0 -11
  149. data/lib/rggen/builtins/register_block/host_ifs/axi4lite.rb +0 -93
  150. data/lib/rggen/builtins/register_block/name.rb +0 -26
  151. data/lib/rggen/builtins/register_block/ral_package.rb +0 -24
  152. data/lib/rggen/builtins/register_block/rtl_top.rb +0 -38
  153. data/lib/rggen/builtins/register_block/sub_model_creator.rb +0 -14
  154. data/lib/rggen/commands.rb +0 -23
  155. data/lib/rggen/core_components.rb +0 -54
  156. data/lib/rggen/core_components/c_header/item.rb +0 -8
  157. data/lib/rggen/core_components/c_header/setup.rb +0 -19
  158. data/lib/rggen/core_components/c_utility.rb +0 -19
  159. data/lib/rggen/core_components/c_utility/data_structure_definition.rb +0 -60
  160. data/lib/rggen/core_components/c_utility/source_file.rb +0 -10
  161. data/lib/rggen/core_components/c_utility/variable_declaration.rb +0 -35
  162. data/lib/rggen/core_components/code_utility.rb +0 -56
  163. data/lib/rggen/core_components/code_utility/code_block.rb +0 -72
  164. data/lib/rggen/core_components/code_utility/line.rb +0 -28
  165. data/lib/rggen/core_components/code_utility/source_file.rb +0 -97
  166. data/lib/rggen/core_components/configuration/configuration_factory.rb +0 -23
  167. data/lib/rggen/core_components/configuration/item.rb +0 -11
  168. data/lib/rggen/core_components/configuration/item_factory.rb +0 -20
  169. data/lib/rggen/core_components/configuration/raise_error.rb +0 -11
  170. data/lib/rggen/core_components/configuration/setup.rb +0 -14
  171. data/lib/rggen/core_components/erb_engine.rb +0 -15
  172. data/lib/rggen/core_components/ral/component.rb +0 -24
  173. data/lib/rggen/core_components/ral/item.rb +0 -59
  174. data/lib/rggen/core_components/ral/setup.rb +0 -19
  175. data/lib/rggen/core_components/register_map/bit_field_factory.rb +0 -11
  176. data/lib/rggen/core_components/register_map/component.rb +0 -15
  177. data/lib/rggen/core_components/register_map/component_factory.rb +0 -9
  178. data/lib/rggen/core_components/register_map/generic_map.rb +0 -80
  179. data/lib/rggen/core_components/register_map/item.rb +0 -26
  180. data/lib/rggen/core_components/register_map/item_factory.rb +0 -26
  181. data/lib/rggen/core_components/register_map/loader.rb +0 -11
  182. data/lib/rggen/core_components/register_map/raise_error.rb +0 -17
  183. data/lib/rggen/core_components/register_map/register_block_factory.rb +0 -29
  184. data/lib/rggen/core_components/register_map/register_factory.rb +0 -18
  185. data/lib/rggen/core_components/register_map/register_map_factory.rb +0 -18
  186. data/lib/rggen/core_components/register_map/setup.rb +0 -33
  187. data/lib/rggen/core_components/rtl/component.rb +0 -24
  188. data/lib/rggen/core_components/rtl/item.rb +0 -82
  189. data/lib/rggen/core_components/rtl/setup.rb +0 -19
  190. data/lib/rggen/core_components/verilog_utility.rb +0 -88
  191. data/lib/rggen/core_components/verilog_utility/class_definition.rb +0 -56
  192. data/lib/rggen/core_components/verilog_utility/identifier.rb +0 -78
  193. data/lib/rggen/core_components/verilog_utility/interface_instance.rb +0 -37
  194. data/lib/rggen/core_components/verilog_utility/interface_port.rb +0 -33
  195. data/lib/rggen/core_components/verilog_utility/local_scope.rb +0 -75
  196. data/lib/rggen/core_components/verilog_utility/module_definition.rb +0 -82
  197. data/lib/rggen/core_components/verilog_utility/package_definition.rb +0 -57
  198. data/lib/rggen/core_components/verilog_utility/source_file.rb +0 -10
  199. data/lib/rggen/core_components/verilog_utility/structure_definition.rb +0 -51
  200. data/lib/rggen/core_components/verilog_utility/subroutine_definition.rb +0 -41
  201. data/lib/rggen/core_components/verilog_utility/variable.rb +0 -115
  202. data/lib/rggen/core_extensions/array.rb +0 -9
  203. data/lib/rggen/core_extensions/facets.rb +0 -22
  204. data/lib/rggen/core_extensions/forwardable.rb +0 -49
  205. data/lib/rggen/core_extensions/integer.rb +0 -5
  206. data/lib/rggen/core_extensions/math.rb +0 -7
  207. data/lib/rggen/core_extensions/roo.rb +0 -17
  208. data/lib/rggen/exceptions.rb +0 -28
  209. data/lib/rggen/generator.rb +0 -67
  210. data/lib/rggen/input_base/component.rb +0 -28
  211. data/lib/rggen/input_base/component_factory.rb +0 -58
  212. data/lib/rggen/input_base/item.rb +0 -171
  213. data/lib/rggen/input_base/item_factory.rb +0 -13
  214. data/lib/rggen/input_base/loader.rb +0 -23
  215. data/lib/rggen/input_base/regexp_patterns.rb +0 -29
  216. data/lib/rggen/option_switches.rb +0 -60
  217. data/lib/rggen/options.rb +0 -97
  218. data/lib/rggen/output_base/code_generator.rb +0 -36
  219. data/lib/rggen/output_base/component.rb +0 -78
  220. data/lib/rggen/output_base/component_factory.rb +0 -32
  221. data/lib/rggen/output_base/file_writer.rb +0 -36
  222. data/lib/rggen/output_base/item.rb +0 -110
  223. data/lib/rggen/output_base/item_factory.rb +0 -9
  224. data/lib/rggen/output_base/template_engine.rb +0 -24
  225. data/lib/rggen/rggen_home.rb +0 -3
  226. data/ral/LICENSE +0 -21
  227. data/ral/compile.f +0 -2
  228. data/ral/rggen_ral_block.svh +0 -83
  229. data/ral/rggen_ral_field.svh +0 -47
  230. data/ral/rggen_ral_field_rwl_rwe.svh +0 -158
  231. data/ral/rggen_ral_indirect_reg.svh +0 -193
  232. data/ral/rggen_ral_macros.svh +0 -27
  233. data/ral/rggen_ral_map.svh +0 -124
  234. data/ral/rggen_ral_pkg.sv +0 -15
  235. data/ral/rggen_ral_reg.svh +0 -88
  236. data/rtl/LICENSE +0 -21
  237. data/rtl/compile.f +0 -18
  238. data/rtl/rggen_address_decoder.sv +0 -23
  239. data/rtl/rggen_apb_if.sv +0 -41
  240. data/rtl/rggen_axi4lite_if.sv +0 -68
  241. data/rtl/rggen_bit_field_if.sv +0 -28
  242. data/rtl/rggen_bit_field_ro.sv +0 -9
  243. data/rtl/rggen_bit_field_rw.sv +0 -25
  244. data/rtl/rggen_bit_field_rwl_rwe.sv +0 -29
  245. data/rtl/rggen_bit_field_w01s_w01c.sv +0 -55
  246. data/rtl/rggen_bus_if.sv +0 -43
  247. data/rtl/rggen_bus_splitter.sv +0 -86
  248. data/rtl/rggen_default_register.sv +0 -15
  249. data/rtl/rggen_external_register.sv +0 -83
  250. data/rtl/rggen_host_if_apb.sv +0 -29
  251. data/rtl/rggen_host_if_axi4lite.sv +0 -161
  252. data/rtl/rggen_indirect_register.sv +0 -21
  253. data/rtl/rggen_register_base.sv +0 -57
  254. data/rtl/rggen_register_if.sv +0 -42
  255. data/rtl/rggen_rtl_pkg.sv +0 -23
  256. data/sample/LICENSE +0 -21
  257. data/sample/sample.csv +0 -21
  258. data/sample/sample.json +0 -6
  259. data/sample/sample.xls +0 -0
  260. data/sample/sample.xlsx +0 -0
  261. data/sample/sample.yaml +0 -4
  262. data/sample/sample_0.h +0 -17
  263. data/sample/sample_0.sv +0 -402
  264. data/sample/sample_0_ral_pkg.sv +0 -145
  265. data/sample/sample_1.h +0 -9
  266. data/sample/sample_1.sv +0 -128
  267. data/sample/sample_1_ral_pkg.sv +0 -56
  268. data/sample/sample_setup.rb +0 -24
  269. data/setup/default.rb +0 -14
@@ -0,0 +1,8 @@
1
+ function new(string name);
2
+ super.new(name, <%= register.width%>, 0);
3
+ endfunction
4
+ function void build();
5
+ <% field_model_constructors.each do |constructor| %>
6
+ <%= constructor %>
7
+ <% end%>
8
+ endfunction
@@ -0,0 +1,15 @@
1
+ rggen_default_register #(
2
+ .READABLE (<%= readable %>),
3
+ .WRITABLE (<%= writable %>),
4
+ .ADDRESS_WIDTH (<%= address_width %>),
5
+ .OFFSET_ADDRESS (<%= offset_address %>),
6
+ .BUS_WIDTH (<%= configuration.bus_width %>),
7
+ .DATA_WIDTH (<%= register.width %>),
8
+ .VALID_BITS (<%= valid_bits %>),
9
+ .REGISTER_INDEX (<%= register_index %>)
10
+ ) u_register (
11
+ .i_clk (<%= register_block.clock %>),
12
+ .i_rst_n (<%= register_block.reset %>),
13
+ .register_if (<%= register_if %>),
14
+ .bit_field_if (<%= register.bit_field_if %>)
15
+ );
@@ -0,0 +1,11 @@
1
+ rggen_external_register #(
2
+ .ADDRESS_WIDTH (<%= address_width %>),
3
+ .BUS_WIDTH (<%= bus_width %>),
4
+ .START_ADDRESS (<%= start_address %>),
5
+ .END_ADDRESS (<%= end_address %>)
6
+ ) u_register (
7
+ .i_clk (<%= register_block.clock %>),
8
+ .i_rst_n (<%= register_block.reset %>),
9
+ .register_if (<%= register_if %>),
10
+ .bus_if (<%= bus_if %>)
11
+ );
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:register, :type, :external) do
4
+ register_map do
5
+ writable? { true }
6
+ readable? { true }
7
+ no_bit_fields
8
+
9
+ verify(:component) do
10
+ error_condition { register.size && register.size.length > 1 }
11
+ message do
12
+ 'external register type supports single size definition only'
13
+ end
14
+ end
15
+ end
16
+
17
+ sv_rtl do
18
+ build do
19
+ if configuration.fold_sv_interface_port?
20
+ interface_port :register_block, :bus_if, {
21
+ name: "#{register.name}_bus_if",
22
+ interface_type: 'rggen_bus_if',
23
+ modport: 'master'
24
+ }
25
+ else
26
+ output :register_block, :valid, {
27
+ name: "o_#{register.name}_valid",
28
+ data_type: :logic,
29
+ width: 1
30
+ }
31
+ output :register_block, :address, {
32
+ name: "o_#{register.name}_address",
33
+ data_type: :logic,
34
+ width: address_width
35
+ }
36
+ output :register_block, :write, {
37
+ name: "o_#{register.name}_write",
38
+ data_type: :logic,
39
+ width: 1
40
+ }
41
+ output :register_block, :write_data, {
42
+ name: "o_#{register.name}_data",
43
+ data_type: :logic,
44
+ width: bus_width
45
+ }
46
+ output :register_block, :strobe, {
47
+ name: "o_#{register.name}_strobe",
48
+ data_type: :logic,
49
+ width: byte_width
50
+ }
51
+ input :register_block, :ready, {
52
+ name: "i_#{register.name}_ready",
53
+ data_type: :logic,
54
+ width: 1
55
+ }
56
+ input :register_block, :status, {
57
+ name: "i_#{register.name}_status",
58
+ data_type: :logic,
59
+ width: 2
60
+ }
61
+ input :register_block, :read_data, {
62
+ name: "i_#{register.name}_data",
63
+ data_type: :logic,
64
+ width: bus_width
65
+ }
66
+ interface :register, :bus_if, {
67
+ name: 'bus_if',
68
+ interface_type: 'rggen_bus_if',
69
+ parameter_values: [address_width, bus_width],
70
+ variables: [
71
+ 'valid', 'address', 'write', 'write_data', 'strobe',
72
+ 'ready', 'status', 'read_data'
73
+ ]
74
+ }
75
+ end
76
+ end
77
+
78
+ main_code :register, from_template: true
79
+ main_code :register do |code|
80
+ unless configuration.fold_sv_interface_port?
81
+ [
82
+ [valid, bus_if.valid],
83
+ [address, bus_if.address],
84
+ [write, bus_if.write],
85
+ [write_data, bus_if.write_data],
86
+ [strobe, bus_if.strobe],
87
+ [bus_if.ready, ready],
88
+ [bus_if.status, "rggen_status'(#{status})"],
89
+ [bus_if.read_data, read_data]
90
+ ].map { |lhs, rhs| code << assign(lhs, rhs) << nl }
91
+ end
92
+ end
93
+
94
+ private
95
+
96
+ def address_width
97
+ register_block.local_address_width
98
+ end
99
+
100
+ def bus_width
101
+ configuration.bus_width
102
+ end
103
+
104
+ def byte_width
105
+ configuration.byte_width
106
+ end
107
+
108
+ def start_address
109
+ hex(register.offset_address, address_width)
110
+ end
111
+
112
+ def end_address
113
+ address = register.offset_address + register.byte_size - 1
114
+ hex(address, address_width)
115
+ end
116
+ end
117
+
118
+ sv_ral do
119
+ build do
120
+ parameter :register_block, :model_type, {
121
+ name: model_name,
122
+ data_type: 'type',
123
+ default: 'rggen_ral_block'
124
+ }
125
+ parameter :register_block, :integrate_model, {
126
+ name: "INTEGRATE_#{model_name}",
127
+ data_type: 'bit',
128
+ default: 1
129
+ }
130
+ end
131
+
132
+ model_name { register.name.upcase }
133
+
134
+ constructor do
135
+ macro_call(
136
+ 'rggen_ral_create_block_model',
137
+ [ral_model, offset_address, 'this', integrate_model]
138
+ )
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,329 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:register, :type, :indirect) do
4
+ register_map do
5
+ define_helpers do
6
+ index_verifier = Class.new do
7
+ def initialize(&block)
8
+ instance_eval(&block)
9
+ end
10
+
11
+ def error_condition(&block)
12
+ @error_condition = block
13
+ end
14
+
15
+ def message(&block)
16
+ @message = block
17
+ end
18
+
19
+ def verify(feature, index)
20
+ error?(feature, index) && raise_error(feature, index)
21
+ end
22
+
23
+ def error?(feature, index)
24
+ feature.instance_exec(index, &@error_condition)
25
+ end
26
+
27
+ def raise_error(feature, index)
28
+ error_message = feature.instance_exec(index, &@message)
29
+ feature.__send__(:error, error_message)
30
+ end
31
+ end
32
+
33
+ define_method(:verify_index) do |&block|
34
+ index_verifiers << index_verifier.new(&block)
35
+ end
36
+
37
+ def index_verifiers
38
+ @index_verifiers ||= []
39
+ end
40
+ end
41
+
42
+ define_struct :index_entry, [:name, :value] do
43
+ def value_index?
44
+ !array_index?
45
+ end
46
+
47
+ def array_index?
48
+ value.nil?
49
+ end
50
+
51
+ def distinguishable?(other)
52
+ name == other.name && value != other.value &&
53
+ [self, other].all?(&:value_index?)
54
+ end
55
+
56
+ def find_index_field(bit_fields)
57
+ bit_fields.find { |bit_field| bit_field.full_name == name }
58
+ end
59
+ end
60
+
61
+ property :index_entries
62
+ property :collect_index_fields do |bit_fields|
63
+ index_entries.map { |entry| entry.find_index_field(bit_fields) }
64
+ end
65
+
66
+ byte_size { byte_width }
67
+ support_array_register
68
+ support_overlapped_address
69
+
70
+ input_pattern [
71
+ /(#{variable_name}\.#{variable_name})/,
72
+ /(#{variable_name}\.#{variable_name}):(#{integer})?/
73
+ ], match_automatically: false
74
+
75
+ build do
76
+ @index_entries = parse_index_entries
77
+ end
78
+
79
+ verify(:component) do
80
+ error_condition do
81
+ register.array? &&
82
+ register.array_size.length < array_index_fields.length
83
+ end
84
+ message { 'too many array indices are given' }
85
+ end
86
+
87
+ verify(:component) do
88
+ error_condition do
89
+ register.array? &&
90
+ register.array_size.length > array_index_fields.length
91
+ end
92
+ message { 'less array indices are given' }
93
+ end
94
+
95
+ verify(:all) do
96
+ check_error do
97
+ index_entries.each(&method(:verify_indirect_index))
98
+ end
99
+ end
100
+
101
+ verify_index do
102
+ error_condition do |index|
103
+ !index_entries.one? { |other| other.name == index.name }
104
+ end
105
+ message do |index|
106
+ "same bit field is used as indirect index more than once: #{index.name}"
107
+ end
108
+ end
109
+
110
+ verify_index do
111
+ error_condition { |index| !index_field(index) }
112
+ message do |index|
113
+ "no such bit field for indirect index is found: #{index.name}"
114
+ end
115
+ end
116
+
117
+ verify_index do
118
+ error_condition do |index|
119
+ index_field(index).register.name == register.name
120
+ end
121
+ message do |index|
122
+ "own bit field is not allowed for indirect index: #{index.name}"
123
+ end
124
+ end
125
+
126
+ verify_index do
127
+ error_condition { |index| index_field(index).register.array? }
128
+ message do |index|
129
+ 'bit field of array register is not allowed ' \
130
+ "for indirect index: #{index.name}"
131
+ end
132
+ end
133
+
134
+ verify_index do
135
+ error_condition { |index| index_field(index).sequential? }
136
+ message do |index|
137
+ 'sequential bit field is not allowed ' \
138
+ "for indirect index: #{index.name}"
139
+ end
140
+ end
141
+
142
+ verify_index do
143
+ error_condition { |index| index_field(index).reserved? }
144
+ message do |index|
145
+ 'reserved bit field is not allowed ' \
146
+ "for indirect index: #{index.name}"
147
+ end
148
+ end
149
+
150
+ verify_index do
151
+ error_condition do |index|
152
+ !index.array_index? &&
153
+ (index.value > (2**index_field(index).width - 1))
154
+ end
155
+ message do |index|
156
+ 'bit width of indirect index is not enough for ' \
157
+ "index value #{index.value}: #{index.name}"
158
+ end
159
+ end
160
+
161
+ verify_index do
162
+ error_condition do |index|
163
+ index.array_index? &&
164
+ (array_index_value(index) > 2**index_field(index).width)
165
+ end
166
+ message do |index|
167
+ 'bit width of indirect index is not enough for ' \
168
+ "array size #{array_index_value(index)}: #{index.name}"
169
+ end
170
+ end
171
+
172
+ verify(:all) do
173
+ error_condition { !distinguishable? }
174
+ message { 'cannot be distinguished from other registers' }
175
+ end
176
+
177
+ private
178
+
179
+ def parse_index_entries
180
+ (!options.empty? && options.map(&method(:create_index_entry))) ||
181
+ (error 'no indirect indices are given')
182
+ end
183
+
184
+ def create_index_entry(value)
185
+ input_values = split_value(value)
186
+ if input_values.size == 2
187
+ index_entry.new(input_values[0], convert_index_value(input_values[1]))
188
+ elsif input_values.size == 1
189
+ index_entry.new(input_values[0])
190
+ else
191
+ error 'too many arguments for indirect index ' \
192
+ "are given: #{value.inspect}"
193
+ end
194
+ end
195
+
196
+ def split_value(value)
197
+ input_value = Array(value)
198
+ field_name = input_value.first
199
+ if sting_or_symbol?(field_name) && match_pattern(field_name)
200
+ [*match_data.captures, *input_value[1..-1]]
201
+ else
202
+ error "illegal input value for indirect index: #{value.inspect}"
203
+ end
204
+ end
205
+
206
+ def sting_or_symbol?(value)
207
+ [String, Symbol].any?(&value.method(:is_a?))
208
+ end
209
+
210
+ def convert_index_value(value)
211
+ Integer(value)
212
+ rescue ArgumentError, TypeError
213
+ error "cannot convert #{value.inspect} into indirect index value"
214
+ end
215
+
216
+ def verify_indirect_index(index)
217
+ helper.index_verifiers.each { |verifier| verifier.verify(self, index) }
218
+ end
219
+
220
+ def index_field(index)
221
+ @index_fields ||= {}
222
+ @index_fields[index.name] ||=
223
+ index.find_index_field(register_block.bit_fields)
224
+ end
225
+
226
+ def array_index_fields
227
+ @array_index_fields ||= index_entries.select(&:array_index?)
228
+ end
229
+
230
+ def array_index_value(index)
231
+ @array_index_values ||=
232
+ array_index_fields
233
+ .map.with_index { |entry, i| [entry.name, register.array_size[i]] }
234
+ .to_h
235
+ @array_index_values[index.name]
236
+ end
237
+
238
+ def distinguishable?
239
+ register_block
240
+ .registers.select { |other| share_same_range?(other) }
241
+ .all? { |other| distinguishable_indices?(other.index_entries) }
242
+ end
243
+
244
+ def share_same_range?(other)
245
+ register.name != other.name && register.overlap?(other)
246
+ end
247
+
248
+ def distinguishable_indices?(other_entries)
249
+ index_entries.any? do |entry|
250
+ other_entries.any?(&entry.method(:distinguishable?))
251
+ end
252
+ end
253
+ end
254
+
255
+ sv_rtl do
256
+ build do
257
+ logic :register, :indirect_index, {
258
+ width: index_width
259
+ }
260
+ end
261
+
262
+ main_code :register do |code|
263
+ code << indirect_index_assignment << nl
264
+ code << process_template(File.join(__dir__, 'indirect_sv_rtl.erb'))
265
+ end
266
+
267
+ private
268
+
269
+ def index_fields
270
+ @index_fields ||=
271
+ register.collect_index_fields(register_block.bit_fields)
272
+ end
273
+
274
+ def index_width
275
+ @index_width ||= index_fields.map(&:width).inject(:+)
276
+ end
277
+
278
+ def index_values
279
+ loop_variables = register.loop_variables
280
+ register.index_entries.zip(index_fields).map do |entry, field|
281
+ if entry.array_index?
282
+ loop_variables.shift[0, field.width]
283
+ else
284
+ hex(entry.value, field.width)
285
+ end
286
+ end
287
+ end
288
+
289
+ def indirect_index_assignment
290
+ assign(indirect_index, concat(index_fields.map(&:value)))
291
+ end
292
+ end
293
+
294
+ sv_ral do
295
+ unmapped
296
+ offset_address { register.offset_address }
297
+
298
+ main_code :ral_package do
299
+ class_definition(model_name) do |sv_class|
300
+ sv_class.base 'rggen_ral_indirect_reg'
301
+ sv_class.variables variables
302
+ sv_class.body { model_body }
303
+ end
304
+ end
305
+
306
+ private
307
+
308
+ def model_body
309
+ process_template(File.join(__dir__, 'indirect_sv_ral.erb'))
310
+ end
311
+
312
+ def index_properties
313
+ array_position = -1
314
+ register.index_entries.zip(index_fields).map do |entry, field|
315
+ value =
316
+ if entry.value_index?
317
+ hex(entry.value, field.width)
318
+ else
319
+ "array_index[#{array_position += 1}]"
320
+ end
321
+ [*entry.name.split('.'), value]
322
+ end
323
+ end
324
+
325
+ def index_fields
326
+ register.collect_index_fields(register_block.bit_fields)
327
+ end
328
+ end
329
+ end