rggen 0.4.4 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
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