rggen 0.4.4 → 0.5.1

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 (107) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +3 -2
  4. data/c/rggen.h +17 -0
  5. data/lib/rggen.rb +7 -16
  6. data/lib/rggen/base/item_factory.rb +2 -0
  7. data/lib/rggen/builtins.rb +15 -13
  8. data/lib/rggen/builtins/bit_field/{reserved.rb → types/reserved.rb} +0 -0
  9. data/lib/rggen/builtins/bit_field/{ro.erb → types/ro.erb} +0 -0
  10. data/lib/rggen/builtins/bit_field/{ro.rb → types/ro.rb} +0 -0
  11. data/lib/rggen/builtins/bit_field/{rw.erb → types/rw.erb} +0 -0
  12. data/lib/rggen/builtins/bit_field/{rw.rb → types/rw.rb} +0 -0
  13. data/lib/rggen/builtins/bit_field/{rwl_rwe.erb → types/rwl_rwe.erb} +0 -0
  14. data/lib/rggen/builtins/bit_field/{rwl_rwe.rb → types/rwl_rwe.rb} +0 -0
  15. data/lib/rggen/builtins/bit_field/{w0c_w1c.erb → types/w0c_w1c.erb} +0 -0
  16. data/lib/rggen/builtins/bit_field/{w0c_w1c.rb → types/w0c_w1c.rb} +0 -0
  17. data/lib/rggen/builtins/bit_field/{w0s_w1s.erb → types/w0s_w1s.erb} +0 -0
  18. data/lib/rggen/builtins/bit_field/{w0s_w1s.rb → types/w0s_w1s.rb} +0 -0
  19. data/lib/rggen/builtins/bit_field/{wo.rb → types/wo.rb} +0 -0
  20. data/lib/rggen/builtins/register/address_decoder.erb +9 -9
  21. data/lib/rggen/builtins/register/address_decoder.rb +24 -24
  22. data/lib/rggen/builtins/register/array.rb +0 -22
  23. data/lib/rggen/builtins/register/bus_exporter.rb +10 -2
  24. data/lib/rggen/builtins/register/indirect_index_configurator.rb +54 -0
  25. data/lib/rggen/builtins/register/offset_address.rb +21 -15
  26. data/lib/rggen/builtins/register/read_data.rb +1 -1
  27. data/lib/rggen/builtins/register/reg_model.rb +5 -5
  28. data/lib/rggen/builtins/register/sub_block_model.rb +1 -1
  29. data/lib/rggen/builtins/register/type.rb +207 -0
  30. data/lib/rggen/builtins/register/types/external.rb +15 -0
  31. data/lib/rggen/builtins/register/types/indirect.rb +134 -0
  32. data/lib/rggen/builtins/register/uniqueness_validator.rb +10 -7
  33. data/lib/rggen/builtins/register_block/address_struct.rb +56 -0
  34. data/lib/rggen/builtins/register_block/c_header_file.rb +15 -0
  35. data/lib/rggen/builtins/register_block/{apb.erb → host_ifs/apb.erb} +0 -0
  36. data/lib/rggen/builtins/register_block/{apb.rb → host_ifs/apb.rb} +0 -0
  37. data/lib/rggen/builtins/register_block/{axi4lite.erb → host_ifs/axi4lite.erb} +0 -0
  38. data/lib/rggen/builtins/register_block/{axi4lite.rb → host_ifs/axi4lite.rb} +0 -0
  39. data/lib/rggen/builtins/register_block/ral_package.rb +6 -1
  40. data/lib/rggen/builtins/register_block/response_mux.rb +2 -2
  41. data/lib/rggen/builtins/register_block/top_module.rb +5 -1
  42. data/lib/rggen/core_components.rb +25 -0
  43. data/lib/rggen/core_components/c_header/item.rb +8 -0
  44. data/lib/rggen/core_components/c_header/setup.rb +19 -0
  45. data/lib/rggen/core_components/c_utility.rb +19 -0
  46. data/lib/rggen/core_components/c_utility/data_structure_definition.rb +62 -0
  47. data/lib/rggen/core_components/c_utility/source_file.rb +10 -0
  48. data/lib/rggen/core_components/c_utility/variable_declaration.rb +35 -0
  49. data/lib/rggen/core_components/code_utility.rb +56 -0
  50. data/lib/rggen/{output_base → core_components/code_utility}/code_block.rb +1 -1
  51. data/lib/rggen/{output_base → core_components/code_utility}/line.rb +1 -1
  52. data/lib/rggen/core_components/code_utility/source_file.rb +97 -0
  53. data/lib/rggen/core_components/erb_engine.rb +15 -0
  54. data/lib/rggen/core_components/ral/item.rb +2 -1
  55. data/lib/rggen/core_components/register_map/generic_map.rb +3 -1
  56. data/lib/rggen/core_components/rtl/item.rb +2 -1
  57. data/lib/rggen/core_components/verilog_utility.rb +69 -0
  58. data/lib/rggen/core_components/verilog_utility/class_definition.rb +56 -0
  59. data/lib/rggen/core_components/verilog_utility/declaration.rb +66 -0
  60. data/lib/rggen/core_components/verilog_utility/identifier.rb +27 -0
  61. data/lib/rggen/core_components/verilog_utility/module_definition.rb +71 -0
  62. data/lib/rggen/core_components/verilog_utility/package_definition.rb +65 -0
  63. data/lib/rggen/core_components/verilog_utility/source_file.rb +10 -0
  64. data/lib/rggen/core_components/verilog_utility/structure_definition.rb +50 -0
  65. data/lib/rggen/core_components/verilog_utility/subroutine_definition.rb +41 -0
  66. data/lib/rggen/core_extensions/facets.rb +5 -0
  67. data/lib/rggen/generator.rb +19 -5
  68. data/lib/rggen/input_base/item.rb +6 -6
  69. data/lib/rggen/output_base/code_generator.rb +36 -0
  70. data/lib/rggen/output_base/component.rb +27 -41
  71. data/lib/rggen/output_base/file_writer.rb +36 -0
  72. data/lib/rggen/output_base/item.rb +34 -100
  73. data/lib/rggen/output_base/template_engine.rb +24 -0
  74. data/lib/rggen/rggen_home.rb +3 -0
  75. data/lib/rggen/version.rb +2 -2
  76. data/ral/rggen_ral_block.svh +1 -1
  77. data/ral/rggen_ral_indirect_reg.svh +193 -0
  78. data/ral/rggen_ral_map.svh +20 -20
  79. data/ral/rggen_ral_pkg.sv +1 -1
  80. data/rtl/register/rggen_address_decoder.sv +14 -14
  81. data/sample/sample.csv +21 -22
  82. data/sample/sample.xls +0 -0
  83. data/sample/sample.xlsx +0 -0
  84. data/sample/sample_0.h +17 -0
  85. data/sample/sample_0.sv +92 -92
  86. data/sample/sample_0_ral_pkg.sv +8 -5
  87. data/sample/sample_1.h +9 -0
  88. data/sample/sample_1.sv +27 -27
  89. data/sample/sample_1_ral_pkg.sv +3 -0
  90. data/sample/sample_setup.rb +4 -2
  91. data/setup/default.rb +4 -2
  92. metadata +53 -36
  93. data/lib/rggen/builtins/register/accessibility.rb +0 -23
  94. data/lib/rggen/builtins/register/external.rb +0 -42
  95. data/lib/rggen/builtins/register/shadow.rb +0 -130
  96. data/lib/rggen/builtins/register/shadow_index_configurator.rb +0 -56
  97. data/lib/rggen/output_base/code_utility.rb +0 -50
  98. data/lib/rggen/output_base/template_utility.rb +0 -29
  99. data/lib/rggen/output_base/verilog_utility.rb +0 -69
  100. data/lib/rggen/output_base/verilog_utility/class_definition.rb +0 -58
  101. data/lib/rggen/output_base/verilog_utility/declaration.rb +0 -68
  102. data/lib/rggen/output_base/verilog_utility/identifier.rb +0 -29
  103. data/lib/rggen/output_base/verilog_utility/module_definition.rb +0 -73
  104. data/lib/rggen/output_base/verilog_utility/package_definition.rb +0 -67
  105. data/lib/rggen/output_base/verilog_utility/structure_definition.rb +0 -52
  106. data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +0 -43
  107. data/ral/rggen_ral_shadow_reg.svh +0 -193
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2587afe35c81233ad40e7b9e5aabf23b0c1fb16e
4
- data.tar.gz: 53b684c32ded344767638a0fae8d5b40009ffacf
3
+ metadata.gz: b5ce1005a53b9e917a5b5e00783ac95122b51d9c
4
+ data.tar.gz: 2cd68011eb9acbf244743a660311cd973a249b53
5
5
  SHA512:
6
- metadata.gz: d4cf2349effee3d5540a3b7c3d5ede666a9b09643ef4cf5925002e02a0b601bdf4a678c9f3828213e17f69c95f82981ae82de169a2cccaf37ff89063660b0e44
7
- data.tar.gz: c0fcc9a323fa098ec31cc2b924f58ac8bde2cb230b207828e0d4ddf92cdf779cb1437f08941ccff970163387bd3d9e0c920d9a58853fa4ed079610f827cf997c
6
+ metadata.gz: b16b2bcae8107eadff8fe24ac66c335eaeae10c514233e25e6756da8629879bc7bc1088658cd612ddd8c77f6b4a91d06ec27dadb126e63461f489a4be59dd1f2
7
+ data.tar.gz: b37b9f7952ba07addf76a5cff942e75353d883a58c8a754e0d09134ebe91aa2ecd5982ab51a571a23865583a1f1d34205185e9fa43dd8a7b173873db55bc36a7
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015 Taichi Ishitani
3
+ Copyright (c) 2015-2017 Taichi Ishitani
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -3,12 +3,13 @@
3
3
  [![Dependency Status](https://dependencyci.com/github/taichi-ishitani/rggen/badge)](https://dependencyci.com/github/taichi-ishitani/rggen)
4
4
  [![Code Climate](https://codeclimate.com/github/taichi-ishitani/rggen/badges/gpa.svg)](https://codeclimate.com/github/taichi-ishitani/rggen)
5
5
  [![Test Coverage](https://codeclimate.com/github/taichi-ishitani/rggen/badges/coverage.svg)](https://codeclimate.com/github/taichi-ishitani/rggen/coverage)
6
+ [![Coverity Scan](https://scan.coverity.com/projects/10804/badge.svg)](https://scan.coverity.com/projects/taichi-ishitani-rggen)
6
7
  [![Join the chat at https://gitter.im/taichi-ishitani/rggen](https://badges.gitter.im/taichi-ishitani/rggen.svg)](https://gitter.im/taichi-ishitani/rggen?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
7
8
 
8
9
  # RgGen
9
10
 
10
11
  RgGen is a code generation tool for SoC designers.
11
- It will automatically generate source code for control registers in a SoC design, e.g. RTL, UVM RAL model, from its register map document.
12
+ It will automatically generate source code for control registers in a SoC design, e.g. RTL, UVM RAL model, C header file, from its register map document.
12
13
  Also RgGen is customizable so you can build your specific generate tool.
13
14
 
14
15
  ## Ruby
@@ -54,5 +55,5 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/taichi
54
55
 
55
56
  ## License
56
57
 
57
- Copyright © 2015-2016 Taichi Ishitani.
58
+ Copyright © 2015-2017 Taichi Ishitani.
58
59
  RgGen is available as open source under the terms of [the MIT License](LICENSE.txt).
data/c/rggen.h ADDED
@@ -0,0 +1,17 @@
1
+ #ifndef RGGEN_H
2
+ #define RGGEN_H
3
+
4
+ #include <stdint.h>
5
+
6
+ typedef uint8_t rggen_uint8;
7
+ typedef uint16_t rggen_uint16;
8
+ typedef uint32_t rggen_uint32;
9
+ typedef uint64_t rggen_uint64;
10
+
11
+ #define RGGEN_EXTERNAL_REGISTERS(SIZE, TYPE) \
12
+ union { \
13
+ rggen_uint8 array[SIZE]; \
14
+ TYPE body; \
15
+ }
16
+
17
+ #endif
data/lib/rggen.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  module RgGen
2
- RGGEN_HOME = File.realpath(File.join(__dir__, '..'))
3
-
4
2
  require 'forwardable'
5
- require 'baby_erubis'
6
- require 'fileutils'
3
+ require 'singleton'
4
+ require 'pathname'
7
5
  require 'optparse'
6
+ require 'baby_erubis'
8
7
 
9
8
  require_relative 'rggen/version'
9
+ require_relative 'rggen/rggen_home'
10
10
 
11
11
  require_relative 'rggen/exceptions'
12
12
 
@@ -31,18 +31,9 @@ module RgGen
31
31
  require_relative 'rggen/input_base/component_factory'
32
32
  require_relative 'rggen/input_base/item_factory'
33
33
 
34
- require_relative 'rggen/output_base/line'
35
- require_relative 'rggen/output_base/code_block'
36
- require_relative 'rggen/output_base/code_utility'
37
- require_relative 'rggen/output_base/template_utility'
38
- require_relative 'rggen/output_base/verilog_utility/identifier'
39
- require_relative 'rggen/output_base/verilog_utility/declaration'
40
- require_relative 'rggen/output_base/verilog_utility/structure_definition'
41
- require_relative 'rggen/output_base/verilog_utility/module_definition'
42
- require_relative 'rggen/output_base/verilog_utility/package_definition'
43
- require_relative 'rggen/output_base/verilog_utility/class_definition'
44
- require_relative 'rggen/output_base/verilog_utility/subroutine_definition'
45
- require_relative 'rggen/output_base/verilog_utility'
34
+ require_relative 'rggen/output_base/code_generator'
35
+ require_relative 'rggen/output_base/template_engine'
36
+ require_relative 'rggen/output_base/file_writer'
46
37
  require_relative 'rggen/output_base/component'
47
38
  require_relative 'rggen/output_base/item'
48
39
  require_relative 'rggen/output_base/component_factory'
@@ -1,6 +1,8 @@
1
1
  module RgGen
2
2
  module Base
3
3
  class ItemFactory
4
+ extend InternalStruct
5
+
4
6
  attr_writer :target_items
5
7
  attr_writer :target_item
6
8
 
@@ -13,39 +13,41 @@ require_relative 'builtins/bit_field/initial_value'
13
13
  require_relative 'builtins/bit_field/name'
14
14
  require_relative 'builtins/bit_field/reference'
15
15
  require_relative 'builtins/bit_field/type'
16
- require_relative 'builtins/bit_field/rw'
17
- require_relative 'builtins/bit_field/rwl_rwe'
18
- require_relative 'builtins/bit_field/ro'
19
- require_relative 'builtins/bit_field/w0c_w1c'
20
- require_relative 'builtins/bit_field/w0s_w1s'
21
- require_relative 'builtins/bit_field/wo'
22
- require_relative 'builtins/bit_field/reserved'
16
+ require_relative 'builtins/bit_field/types/rw'
17
+ require_relative 'builtins/bit_field/types/rwl_rwe'
18
+ require_relative 'builtins/bit_field/types/ro'
19
+ require_relative 'builtins/bit_field/types/w0c_w1c'
20
+ require_relative 'builtins/bit_field/types/w0s_w1s'
21
+ require_relative 'builtins/bit_field/types/wo'
22
+ require_relative 'builtins/bit_field/types/reserved'
23
23
 
24
- require_relative 'builtins/register/accessibility'
25
24
  require_relative 'builtins/register/address_decoder'
26
25
  require_relative 'builtins/register/array'
27
26
  require_relative 'builtins/register/bus_exporter'
28
27
  require_relative 'builtins/register/constructor'
29
- require_relative 'builtins/register/external'
30
28
  require_relative 'builtins/register/field_model_creator'
29
+ require_relative 'builtins/register/indirect_index_configurator'
31
30
  require_relative 'builtins/register/offset_address'
32
31
  require_relative 'builtins/register/name'
33
32
  require_relative 'builtins/register/read_data'
34
33
  require_relative 'builtins/register/reg_model'
35
- require_relative 'builtins/register/shadow'
36
- require_relative 'builtins/register/shadow_index_configurator'
37
34
  require_relative 'builtins/register/sub_block_model'
35
+ require_relative 'builtins/register/type'
36
+ require_relative 'builtins/register/types/external'
37
+ require_relative 'builtins/register/types/indirect'
38
38
  require_relative 'builtins/register/uniqueness_validator'
39
39
 
40
+ require_relative 'builtins/register_block/address_struct'
40
41
  require_relative 'builtins/register_block/base_address'
41
42
  require_relative 'builtins/register_block/block_model'
42
43
  require_relative 'builtins/register_block/byte_size'
44
+ require_relative 'builtins/register_block/c_header_file'
43
45
  require_relative 'builtins/register_block/clock_reset'
44
46
  require_relative 'builtins/register_block/constructor'
45
47
  require_relative 'builtins/register_block/default_map_creator'
46
48
  require_relative 'builtins/register_block/host_if'
47
- require_relative 'builtins/register_block/apb'
48
- require_relative 'builtins/register_block/axi4lite'
49
+ require_relative 'builtins/register_block/host_ifs/apb'
50
+ require_relative 'builtins/register_block/host_ifs/axi4lite'
49
51
  require_relative 'builtins/register_block/irq_controller'
50
52
  require_relative 'builtins/register_block/name'
51
53
  require_relative 'builtins/register_block/ral_package'
File without changes
File without changes
File without changes
@@ -1,12 +1,12 @@
1
1
  rggen_address_decoder #(
2
- .ADDRESS_WIDTH (<%= local_address_width - address_lsb %>),
3
- .START_ADDRESS (<%= start_address%>),
4
- .END_ADDRESS (<%= end_address %>),
5
- .USE_SHADOW_INDEX (<%= use_shadow_index %>),
6
- .SHADOW_INDEX_WIDTH (<%= shadow_index_width %>),
7
- .SHADOW_INDEX_VALUE (<%= shadow_index_value %>)
2
+ .ADDRESS_WIDTH (<%= local_address_width - address_lsb %>),
3
+ .START_ADDRESS (<%= start_address%>),
4
+ .END_ADDRESS (<%= end_address %>),
5
+ .INDIRECT_REGISTER (<%= indirect_register %>),
6
+ .INDIRECT_INDEX_WIDTH (<%= indirect_index_width %>),
7
+ .INDIRECT_INDEX_VALUE (<%= indirect_index_value %>)
8
8
  ) u_<%= register.name%>_address_decoder (
9
- .i_address (<%= register_block.host_if.address[local_address_width - 1, address_lsb] %>),
10
- .i_shadow_index (<%= (shadow? && shadow_index[loop_variables]) || shadow_index_value %>),
11
- .o_select (<%= register_block.register_select[register.index] %>)
9
+ .i_address (<%= register_block.host_if.address[local_address_width - 1, address_lsb] %>),
10
+ .i_indirect_index (<%= (type?(:indirect) && indirect_index[loop_variables]) || indirect_index_value %>),
11
+ .o_select (<%= register_block.register_select[register.index] %>)
12
12
  );
@@ -1,21 +1,21 @@
1
1
  simple_item :register, :address_decoder do
2
2
  rtl do
3
3
  build do
4
- next unless register.shadow?
5
- logic :shadow_index,
6
- name: "#{register.name}_shadow_index",
7
- width: shadow_index_width,
4
+ next unless type?(:indirect)
5
+ logic :indirect_index,
6
+ name: "#{register.name}_indirect_index",
7
+ width: indirect_index_width,
8
8
  dimensions: register.dimensions
9
9
  end
10
10
 
11
11
  generate_code :module_item do |buffer|
12
- buffer << shadow_index_assignment << nl if shadow?
12
+ buffer << indirect_index_assignment << nl if type?(:indirect)
13
13
  buffer << process_template
14
14
  end
15
15
 
16
16
  delegate [:local_address_width] => :register_block
17
- delegate [:array?, :shadow?, :multiple?] => :register
18
- delegate [:shadow_indexes, :loop_variables] => :register
17
+ delegate [:array?, :type?, :multiple?] => :register
18
+ delegate [:indexes, :loop_variables] => :register
19
19
 
20
20
  def address_lsb
21
21
  Math.clog2(configuration.byte_width)
@@ -40,41 +40,41 @@ simple_item :register, :address_decoder do
40
40
  (array? && multiple? && "#{base} + #{register.local_index}") || base
41
41
  end
42
42
 
43
- def shadow_index_assignment
43
+ def indirect_index_assignment
44
44
  assign(
45
- shadow_index[register.loop_variables],
46
- concat(shadow_index_fields.map(&:value))
45
+ indirect_index[register.loop_variables],
46
+ concat(indirect_index_fields.map(&:value))
47
47
  )
48
48
  end
49
49
 
50
- def use_shadow_index
51
- (shadow? && 1) || 0
50
+ def indirect_register
51
+ (type?(:indirect) && 1) || 0
52
52
  end
53
53
 
54
- def shadow_index_width
55
- return 1 unless shadow?
56
- shadow_index_fields.sum(0, &:width)
54
+ def indirect_index_width
55
+ return 1 unless type?(:indirect)
56
+ indirect_index_fields.sum(0, &:width)
57
57
  end
58
58
 
59
- def shadow_index_value
60
- return hex(0, 1) unless shadow?
61
- concat(shadow_index_values)
59
+ def indirect_index_value
60
+ return hex(0, 1) unless type?(:indirect)
61
+ concat(indirect_index_values)
62
62
  end
63
63
 
64
- def shadow_index_fields
65
- @shadow_index_fields ||= shadow_indexes.map do |index|
64
+ def indirect_index_fields
65
+ @indirect_index_fields ||= indexes.map do |index|
66
66
  register_block.bit_fields.find_by(name: index.name)
67
67
  end
68
68
  end
69
69
 
70
- def shadow_index_values
70
+ def indirect_index_values
71
71
  variables = loop_variables
72
- shadow_indexes.map.with_index do |index, i|
72
+ indexes.map.with_index do |index, i|
73
73
  if index.value
74
- hex(index.value, shadow_index_fields[i].width)
74
+ hex(index.value, indirect_index_fields[i].width)
75
75
  else
76
76
  loop_variable = variables.shift
77
- loop_variable[shadow_index_fields[i].width - 1, 0]
77
+ loop_variable[indirect_index_fields[i].width - 1, 0]
78
78
  end
79
79
  end
80
80
  end
@@ -16,16 +16,6 @@ simple_item :register, :array do
16
16
  end
17
17
  end
18
18
 
19
- validate do
20
- case
21
- when multi_dimensions_array_with_real_register?
22
- error 'not use multi dimensions array with real register'
23
- when mismatch_with_own_byte_size?
24
- error "mismatches with own byte size(#{register.byte_size}):" \
25
- " #{dimensions}"
26
- end
27
- end
28
-
29
19
  def parse_array_dimensions(cell)
30
20
  case
31
21
  when cell.nil? || cell.empty?
@@ -36,18 +26,6 @@ simple_item :register, :array do
36
26
  error "invalid value for array dimension: #{cell.inspect}"
37
27
  end
38
28
  end
39
-
40
- def multi_dimensions_array_with_real_register?
41
- return false unless array?
42
- return false if register.shadow?
43
- register.multiple? && dimensions.size > 1
44
- end
45
-
46
- def mismatch_with_own_byte_size?
47
- return false unless array?
48
- return false if register.shadow?
49
- register.byte_size != dimensions.first * configuration.byte_width
50
- end
51
29
  end
52
30
 
53
31
  rtl do
@@ -4,10 +4,10 @@ simple_item :register, :bus_exporter do
4
4
  :data_width, :byte_width
5
5
  ] => :configuration
6
6
  delegate [
7
- :name, :byte_size, :external?, :index, :external_index
7
+ :name, :byte_size, :index, :external_index
8
8
  ] => :register
9
9
 
10
- available? { external? }
10
+ available? { register.type?(:external) }
11
11
 
12
12
  build do
13
13
  output :valid , name: "o_#{name}_valid" , width: 1
@@ -40,5 +40,13 @@ simple_item :register, :bus_exporter do
40
40
  def start_address
41
41
  hex(register.start_address, register_block.local_address_width)
42
42
  end
43
+
44
+ def external_index
45
+ external_registers.index(&register.method(:equal?))
46
+ end
47
+
48
+ def external_registers
49
+ register_block.registers.select { |r| r.type?(:external) }
50
+ end
43
51
  end
44
52
  end
@@ -0,0 +1,54 @@
1
+ simple_item :register, :indirect_index_configurator do
2
+ ral do
3
+ available? { register.type?(:indirect) }
4
+
5
+ generate_code :reg_model_item do
6
+ function_definition :configure_indirect_indexes do |f|
7
+ f.return_type :void
8
+ f.body { |code| function_body(code) }
9
+ end
10
+ end
11
+
12
+ def function_body(code)
13
+ register.indexes.each do |index|
14
+ code << subroutine_call(:set_indirect_index, arguments(index))
15
+ code << semicolon
16
+ code << nl
17
+ end
18
+ end
19
+
20
+ def arguments(indirect_index)
21
+ [
22
+ parent_name(indirect_index),
23
+ index_name(indirect_index),
24
+ index_value(indirect_index)
25
+ ]
26
+ end
27
+
28
+ def parent_name(indirect_index)
29
+ parent_register = fild_parent_register(indirect_index.name)
30
+ string(parent_register.name)
31
+ end
32
+
33
+ def fild_parent_register(index_name)
34
+ register_block.bit_fields.find_by(name: index_name).register
35
+ end
36
+
37
+ def index_name(indirect_index)
38
+ string(indirect_index.name)
39
+ end
40
+
41
+ def index_value(indirect_index)
42
+ if indirect_index.value
43
+ indirect_index.value
44
+ else
45
+ "indexes[#{array_index}]"
46
+ end
47
+ end
48
+
49
+ def array_index
50
+ @array_index ||= -1
51
+ @array_index += 1
52
+ end
53
+ end
54
+ end
@@ -16,16 +16,9 @@ simple_item :register, :offset_address do
16
16
 
17
17
  build do |cell|
18
18
  @start_address, @end_address = parse_address(cell)
19
- case
20
- when @start_address >= @end_address
21
- error "start address is equal to or greater than end address: #{cell}"
22
- when unaligned_address?
23
- error 'not aligned with data width' \
24
- "(#{configuration.data_width}): #{cell}"
25
- when @end_address > max_address
26
- error 'exceeds the maximum offset address' \
27
- "(0x#{max_address.to_s(16)}): #{cell}"
28
- end
19
+ check_start_end_adderss_relation(cell)
20
+ check_address_align(cell)
21
+ check_address_range(cell)
29
22
  end
30
23
 
31
24
  def parse_address(cell)
@@ -41,11 +34,24 @@ simple_item :register, :offset_address do
41
34
  end
42
35
  end
43
36
 
44
- def unaligned_address?
45
- byte_width = configuration.byte_width
46
- return true unless (@start_address + 0).multiple?(byte_width)
47
- return true unless (@end_address + 1).multiple?(byte_width)
48
- false
37
+ def check_start_end_adderss_relation(cell)
38
+ return if start_address < end_address
39
+ return if [configuration.byte_width, byte_size].all? { |v| v == 1}
40
+ error "start address is equal to or greater than end address: #{cell}"
41
+ end
42
+
43
+ def check_address_align(cell)
44
+ return if [start_address, end_address + 1].all? do |a|
45
+ a.multiple?(configuration.byte_width)
46
+ end
47
+ error 'not aligned with data width' \
48
+ "(#{configuration.data_width}): #{cell}"
49
+ end
50
+
51
+ def check_address_range(cell)
52
+ return if end_address <= max_address
53
+ error 'exceeds the maximum offset address' \
54
+ "(0x#{max_address.to_s(16)}): #{cell}"
49
55
  end
50
56
 
51
57
  def max_address