rggen 0.3.0
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.
- checksums.yaml +7 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +91 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/LICENSE.txt +21 -0
- data/README.md +31 -0
- data/bin/rggen +6 -0
- data/lib/rggen/base/component.rb +27 -0
- data/lib/rggen/base/component_factory.rb +46 -0
- data/lib/rggen/base/hierarchical_accessors.rb +87 -0
- data/lib/rggen/base/hierarchical_item_accessors.rb +79 -0
- data/lib/rggen/base/item.rb +24 -0
- data/lib/rggen/base/item_factory.rb +20 -0
- data/lib/rggen/builder/builder.rb +69 -0
- data/lib/rggen/builder/category.rb +52 -0
- data/lib/rggen/builder/component_entry.rb +50 -0
- data/lib/rggen/builder/component_store.rb +42 -0
- data/lib/rggen/builder/input_component_store.rb +25 -0
- data/lib/rggen/builder/item_store.rb +89 -0
- data/lib/rggen/builder/list_item_entry.rb +81 -0
- data/lib/rggen/builder/output_component_store.rb +13 -0
- data/lib/rggen/builder/simple_item_entry.rb +33 -0
- data/lib/rggen/builtins/bit_field/bit_assignment.rb +39 -0
- data/lib/rggen/builtins/bit_field/field_model_creation.rb +25 -0
- data/lib/rggen/builtins/bit_field/field_model_declaration.rb +9 -0
- data/lib/rggen/builtins/bit_field/initial_value.rb +36 -0
- data/lib/rggen/builtins/bit_field/name.rb +26 -0
- data/lib/rggen/builtins/bit_field/reference.rb +42 -0
- data/lib/rggen/builtins/bit_field/reserved.rb +9 -0
- data/lib/rggen/builtins/bit_field/ro.rb +19 -0
- data/lib/rggen/builtins/bit_field/rw.erb +13 -0
- data/lib/rggen/builtins/bit_field/rw.rb +25 -0
- data/lib/rggen/builtins/bit_field/type.rb +205 -0
- data/lib/rggen/builtins/bit_field/wo.rb +5 -0
- data/lib/rggen/builtins/global/address_width.rb +17 -0
- data/lib/rggen/builtins/global/data_width.rb +20 -0
- data/lib/rggen/builtins/loaders/configuration/json_loader.rb +7 -0
- data/lib/rggen/builtins/loaders/configuration/yaml_loader.rb +7 -0
- data/lib/rggen/builtins/loaders/register_map/csv_loader.rb +14 -0
- data/lib/rggen/builtins/loaders/register_map/xls_loader.rb +19 -0
- data/lib/rggen/builtins/loaders/register_map/xlsx_ods_loader.rb +24 -0
- data/lib/rggen/builtins/register/accessibility.rb +23 -0
- data/lib/rggen/builtins/register/address_decoder.erb +16 -0
- data/lib/rggen/builtins/register/address_decoder.rb +92 -0
- data/lib/rggen/builtins/register/array.rb +133 -0
- data/lib/rggen/builtins/register/field_model_creator.rb +10 -0
- data/lib/rggen/builtins/register/field_model_declarations.rb +7 -0
- data/lib/rggen/builtins/register/name.rb +26 -0
- data/lib/rggen/builtins/register/offset_address.rb +55 -0
- data/lib/rggen/builtins/register/read_data.rb +36 -0
- data/lib/rggen/builtins/register/reg_model_constructor.rb +17 -0
- data/lib/rggen/builtins/register/reg_model_creation.rb +64 -0
- data/lib/rggen/builtins/register/reg_model_declaration.rb +13 -0
- data/lib/rggen/builtins/register/reg_model_definition.rb +22 -0
- data/lib/rggen/builtins/register/shadow.rb +130 -0
- data/lib/rggen/builtins/register/shadow_index_configurator.rb +53 -0
- data/lib/rggen/builtins/register/uniqueness_validator.rb +48 -0
- data/lib/rggen/builtins/register_block/apb.erb +27 -0
- data/lib/rggen/builtins/register_block/apb.rb +20 -0
- data/lib/rggen/builtins/register_block/base_address.rb +64 -0
- data/lib/rggen/builtins/register_block/block_model_constructor.rb +14 -0
- data/lib/rggen/builtins/register_block/block_model_default_map_creator.rb +39 -0
- data/lib/rggen/builtins/register_block/block_model_definition.rb +18 -0
- data/lib/rggen/builtins/register_block/byte_size.rb +37 -0
- data/lib/rggen/builtins/register_block/clock_reset.rb +8 -0
- data/lib/rggen/builtins/register_block/host_if.rb +46 -0
- data/lib/rggen/builtins/register_block/module_definition.rb +13 -0
- data/lib/rggen/builtins/register_block/name.rb +26 -0
- data/lib/rggen/builtins/register_block/ral_package_definition.rb +19 -0
- data/lib/rggen/builtins/register_block/reg_model_creator.rb +14 -0
- data/lib/rggen/builtins/register_block/reg_model_declarations.rb +7 -0
- data/lib/rggen/builtins/register_block/response_mux.erb +14 -0
- data/lib/rggen/builtins/register_block/response_mux.rb +16 -0
- data/lib/rggen/builtins/register_block/signal_declarations.rb +9 -0
- data/lib/rggen/builtins.rb +52 -0
- data/lib/rggen/commands.rb +23 -0
- data/lib/rggen/core_components/configuration/configuration_factory.rb +23 -0
- data/lib/rggen/core_components/configuration/item_factory.rb +13 -0
- data/lib/rggen/core_components/configuration/raise_error.rb +11 -0
- data/lib/rggen/core_components/configuration/setup.rb +14 -0
- data/lib/rggen/core_components/ral/item.rb +16 -0
- data/lib/rggen/core_components/ral/setup.rb +19 -0
- data/lib/rggen/core_components/register_map/bit_field_factory.rb +11 -0
- data/lib/rggen/core_components/register_map/component.rb +12 -0
- data/lib/rggen/core_components/register_map/generic_map.rb +69 -0
- data/lib/rggen/core_components/register_map/item.rb +22 -0
- data/lib/rggen/core_components/register_map/item_factory.rb +13 -0
- data/lib/rggen/core_components/register_map/loader.rb +13 -0
- data/lib/rggen/core_components/register_map/raise_error.rb +17 -0
- data/lib/rggen/core_components/register_map/register_block_factory.rb +29 -0
- data/lib/rggen/core_components/register_map/register_factory.rb +18 -0
- data/lib/rggen/core_components/register_map/register_map_factory.rb +21 -0
- data/lib/rggen/core_components/register_map/setup.rb +33 -0
- data/lib/rggen/core_components/rtl/component.rb +28 -0
- data/lib/rggen/core_components/rtl/item.rb +83 -0
- data/lib/rggen/core_components/rtl/setup.rb +19 -0
- data/lib/rggen/core_components.rb +23 -0
- data/lib/rggen/core_extensions/facets.rb +17 -0
- data/lib/rggen/core_extensions/forwardable.rb +26 -0
- data/lib/rggen/core_extensions/integer.rb +5 -0
- data/lib/rggen/core_extensions/math.rb +7 -0
- data/lib/rggen/exceptions.rb +22 -0
- data/lib/rggen/generator.rb +185 -0
- data/lib/rggen/input_base/component.rb +19 -0
- data/lib/rggen/input_base/component_factory.rb +58 -0
- data/lib/rggen/input_base/item.rb +170 -0
- data/lib/rggen/input_base/item_factory.rb +13 -0
- data/lib/rggen/input_base/loader.rb +14 -0
- data/lib/rggen/input_base/regexp_patterns.rb +29 -0
- data/lib/rggen/output_base/code_block.rb +72 -0
- data/lib/rggen/output_base/code_utility.rb +44 -0
- data/lib/rggen/output_base/component.rb +88 -0
- data/lib/rggen/output_base/component_factory.rb +32 -0
- data/lib/rggen/output_base/item.rb +175 -0
- data/lib/rggen/output_base/item_factory.rb +6 -0
- data/lib/rggen/output_base/line.rb +28 -0
- data/lib/rggen/output_base/template_utility.rb +29 -0
- data/lib/rggen/output_base/verilog_utility/class_definition.rb +23 -0
- data/lib/rggen/output_base/verilog_utility/declaration.rb +70 -0
- data/lib/rggen/output_base/verilog_utility/identifier.rb +29 -0
- data/lib/rggen/output_base/verilog_utility/module_definition.rb +47 -0
- data/lib/rggen/output_base/verilog_utility/package_definition.rb +67 -0
- data/lib/rggen/output_base/verilog_utility/structure_definition.rb +52 -0
- data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +43 -0
- data/lib/rggen/output_base/verilog_utility.rb +66 -0
- data/lib/rggen/version.rb +6 -0
- data/lib/rggen.rb +65 -0
- data/ral/compile.f +4 -0
- data/ral/rggen_ral_block.svh +84 -0
- data/ral/rggen_ral_field.svh +47 -0
- data/ral/rggen_ral_macros.svh +22 -0
- data/ral/rggen_ral_map.svh +124 -0
- data/ral/rggen_ral_pkg.sv +14 -0
- data/ral/rggen_ral_reg.svh +52 -0
- data/ral/rggen_ral_shadow_reg.svh +188 -0
- data/rggen.gemspec +45 -0
- data/rtl/bit_field/rggen_bit_field_rw.sv +28 -0
- data/rtl/register/rggen_address_decoder.sv +49 -0
- data/rtl/register_block/rggen_host_if_apb.sv +40 -0
- data/rtl/register_block/rggen_response_mux.sv +82 -0
- data/sample/sample.csv +14 -0
- data/sample/sample.json +4 -0
- data/sample/sample.xls +0 -0
- data/sample/sample.xlsx +0 -0
- data/sample/sample.yaml +2 -0
- data/sample/sample_0.sv +285 -0
- data/sample/sample_0_ral_pkg.sv +99 -0
- data/sample/sample_1.sv +172 -0
- data/sample/sample_1_ral_pkg.sv +53 -0
- data/sample/sample_setup.rb +21 -0
- data/setup/default.rb +11 -0
- metadata +296 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
simple_item :register_block, :name do
|
|
2
|
+
register_map do
|
|
3
|
+
field :name
|
|
4
|
+
|
|
5
|
+
input_pattern %r{(#{variable_name})}
|
|
6
|
+
|
|
7
|
+
build do |cell|
|
|
8
|
+
@name = parse_name(cell)
|
|
9
|
+
error "repeated register block name: #{@name}" if repeated_name?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def parse_name(cell)
|
|
13
|
+
if pattern_matched?
|
|
14
|
+
captures.first
|
|
15
|
+
else
|
|
16
|
+
error "invalid value for register block name: #{cell.inspect}"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def repeated_name?
|
|
21
|
+
register_map.register_blocks.any? do |block|
|
|
22
|
+
@name == block.name
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
simple_item :register_block, :ral_package_definition do
|
|
2
|
+
ral do
|
|
3
|
+
delegate :name => :register_block
|
|
4
|
+
|
|
5
|
+
write_file '<%= name %>_ral_pkg.sv' do
|
|
6
|
+
package_definition "#{name}_ral_pkg" do |pkg|
|
|
7
|
+
pkg.import_package :uvm_pkg
|
|
8
|
+
pkg.import_package :rggen_ral_pkg
|
|
9
|
+
pkg.include_file 'uvm_macros.svh'
|
|
10
|
+
pkg.include_file 'rggen_ral_macros.svh'
|
|
11
|
+
pkg.body { |code| body_code(code) }
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def body_code(code)
|
|
16
|
+
register_block.generate_code(:package_item, :bottom_up, code)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
simple_item :register_block, :reg_model_creator do
|
|
2
|
+
ral do
|
|
3
|
+
generate_code :block_model_item do
|
|
4
|
+
function_definition :create_registers do |f|
|
|
5
|
+
f.return_type :void
|
|
6
|
+
f.body { |buffer| function_body(buffer) }
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def function_body(buffer)
|
|
11
|
+
register_block.generate_code(:reg_model_creation, :top_down, buffer)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
rggen_response_mux #(
|
|
2
|
+
.DATA_WIDTH (<%= data_width %>),
|
|
3
|
+
.TOTAL_REGISTERS (<%= total_registers %>)
|
|
4
|
+
) u_response_mux (
|
|
5
|
+
.clk (<%= register_block.clock %>),
|
|
6
|
+
.rst_n (<%= register_block.reset %>),
|
|
7
|
+
.i_command_valid (<%= register_block.host_if.command_valid %>),
|
|
8
|
+
.i_read (<%= register_block.host_if.read %>),
|
|
9
|
+
.o_response_ready (<%= register_block.host_if.response_ready %>),
|
|
10
|
+
.o_read_data (<%= register_block.host_if.read_data %>),
|
|
11
|
+
.o_status (<%= register_block.host_if.status %>),
|
|
12
|
+
.i_register_select (<%= register_select %>),
|
|
13
|
+
.i_register_read_data (<%= register_read_data %>)
|
|
14
|
+
);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
simple_item :register_block, :response_mux do
|
|
2
|
+
rtl do
|
|
3
|
+
build do
|
|
4
|
+
logic :register_select , width: total_registers
|
|
5
|
+
logic :register_read_data, width: data_width, dimensions: [total_registers]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
generate_code_from_template :module_item
|
|
9
|
+
|
|
10
|
+
delegate data_width: :configuration
|
|
11
|
+
|
|
12
|
+
def total_registers
|
|
13
|
+
register_block.registers.map(&:count).sum(0)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require_relative 'builtins/loaders/configuration/json_loader'
|
|
2
|
+
require_relative 'builtins/loaders/configuration/yaml_loader'
|
|
3
|
+
require_relative 'builtins/loaders/register_map/csv_loader'
|
|
4
|
+
require_relative 'builtins/loaders/register_map/xls_loader'
|
|
5
|
+
require_relative 'builtins/loaders/register_map/xlsx_ods_loader'
|
|
6
|
+
|
|
7
|
+
require_relative 'builtins/global/address_width'
|
|
8
|
+
require_relative 'builtins/global/data_width'
|
|
9
|
+
|
|
10
|
+
require_relative 'builtins/bit_field/bit_assignment'
|
|
11
|
+
require_relative 'builtins/bit_field/field_model_creation'
|
|
12
|
+
require_relative 'builtins/bit_field/field_model_declaration'
|
|
13
|
+
require_relative 'builtins/bit_field/initial_value'
|
|
14
|
+
require_relative 'builtins/bit_field/name'
|
|
15
|
+
require_relative 'builtins/bit_field/reference'
|
|
16
|
+
require_relative 'builtins/bit_field/type'
|
|
17
|
+
require_relative 'builtins/bit_field/rw'
|
|
18
|
+
require_relative 'builtins/bit_field/ro'
|
|
19
|
+
require_relative 'builtins/bit_field/wo'
|
|
20
|
+
require_relative 'builtins/bit_field/reserved'
|
|
21
|
+
|
|
22
|
+
require_relative 'builtins/register/accessibility'
|
|
23
|
+
require_relative 'builtins/register/address_decoder'
|
|
24
|
+
require_relative 'builtins/register/array'
|
|
25
|
+
require_relative 'builtins/register/field_model_creator'
|
|
26
|
+
require_relative 'builtins/register/field_model_declarations'
|
|
27
|
+
require_relative 'builtins/register/offset_address'
|
|
28
|
+
require_relative 'builtins/register/name'
|
|
29
|
+
require_relative 'builtins/register/read_data'
|
|
30
|
+
require_relative 'builtins/register/reg_model_constructor'
|
|
31
|
+
require_relative 'builtins/register/reg_model_creation'
|
|
32
|
+
require_relative 'builtins/register/reg_model_declaration'
|
|
33
|
+
require_relative 'builtins/register/reg_model_definition'
|
|
34
|
+
require_relative 'builtins/register/shadow'
|
|
35
|
+
require_relative 'builtins/register/shadow_index_configurator'
|
|
36
|
+
require_relative 'builtins/register/uniqueness_validator'
|
|
37
|
+
|
|
38
|
+
require_relative 'builtins/register_block/base_address'
|
|
39
|
+
require_relative 'builtins/register_block/block_model_constructor'
|
|
40
|
+
require_relative 'builtins/register_block/block_model_default_map_creator'
|
|
41
|
+
require_relative 'builtins/register_block/block_model_definition'
|
|
42
|
+
require_relative 'builtins/register_block/byte_size'
|
|
43
|
+
require_relative 'builtins/register_block/clock_reset'
|
|
44
|
+
require_relative 'builtins/register_block/host_if'
|
|
45
|
+
require_relative 'builtins/register_block/apb'
|
|
46
|
+
require_relative 'builtins/register_block/module_definition'
|
|
47
|
+
require_relative 'builtins/register_block/name'
|
|
48
|
+
require_relative 'builtins/register_block/ral_package_definition'
|
|
49
|
+
require_relative 'builtins/register_block/reg_model_creator'
|
|
50
|
+
require_relative 'builtins/register_block/reg_model_declarations'
|
|
51
|
+
require_relative 'builtins/register_block/response_mux'
|
|
52
|
+
require_relative 'builtins/register_block/signal_declarations'
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
def self.builder
|
|
3
|
+
@builder ||= Builder::Builder.new
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
module Commands
|
|
7
|
+
extend Forwardable
|
|
8
|
+
|
|
9
|
+
[
|
|
10
|
+
[:input_component_store , :input_component_store ],
|
|
11
|
+
[:output_component_store, :output_component_store],
|
|
12
|
+
[:define_simple_item , :simple_item ],
|
|
13
|
+
[:define_list_item , :list_item ],
|
|
14
|
+
[:enable , :enable ],
|
|
15
|
+
[:define_loader , :loader ]
|
|
16
|
+
].each do |method_name, alias_name|
|
|
17
|
+
def_delegator('RgGen.builder', method_name)
|
|
18
|
+
alias_method(alias_name, method_name) if method_name != alias_name
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
include RgGen::Commands
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module Configuration
|
|
3
|
+
class ConfigurationFactory < InputBase::ComponentFactory
|
|
4
|
+
def create_active_items(configuration, hash)
|
|
5
|
+
active_item_factories.each do |name, factory|
|
|
6
|
+
create_item(factory, configuration, hash[name])
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def load(file)
|
|
11
|
+
return {} if file.nil? || file.empty?
|
|
12
|
+
|
|
13
|
+
data = load_file(file)
|
|
14
|
+
if data.is_a?(Hash)
|
|
15
|
+
data.symbolize_keys!
|
|
16
|
+
else
|
|
17
|
+
message = "Hash type required for configuration: #{data.class}"
|
|
18
|
+
fail RgGen::LoadError, message
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module Configuration
|
|
3
|
+
class ItemFactory < InputBase::ItemFactory
|
|
4
|
+
include RaiseError
|
|
5
|
+
|
|
6
|
+
def create(configuration, data = nil)
|
|
7
|
+
item = create_item(configuration, data)
|
|
8
|
+
item.build(data) unless data.nil?
|
|
9
|
+
item
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module Configuration
|
|
3
|
+
input_component_store :configuration do
|
|
4
|
+
entry do
|
|
5
|
+
component_class InputBase::Component
|
|
6
|
+
component_factory ConfigurationFactory
|
|
7
|
+
item_base InputBase::Item, include: RaiseError
|
|
8
|
+
item_factory ItemFactory
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
loader_base InputBase::Loader
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RAL
|
|
3
|
+
class Item < OutputBase::Item
|
|
4
|
+
use_verilog_utility
|
|
5
|
+
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
def model_declaration(model_class, name, attributes = {})
|
|
9
|
+
create_declaration(
|
|
10
|
+
:variable,
|
|
11
|
+
attributes.merge(data_type: model_class, name: name, random: true)
|
|
12
|
+
)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RAL
|
|
3
|
+
output_component_store :ral do
|
|
4
|
+
entry do
|
|
5
|
+
component_class OutputBase::Component
|
|
6
|
+
component_factory OutputBase::ComponentFactory
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
entry [:register_block, :register, :bit_field] do
|
|
10
|
+
component_class OutputBase::Component
|
|
11
|
+
component_factory OutputBase::ComponentFactory
|
|
12
|
+
item_base Item
|
|
13
|
+
item_factory OutputBase::ItemFactory
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
output_directory 'ral'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RegisterMap
|
|
3
|
+
class BitFieldFactory < InputBase::ComponentFactory
|
|
4
|
+
def create_active_items(bit_field, configuration, cells)
|
|
5
|
+
active_item_factories.each_value.with_index do |factory, index|
|
|
6
|
+
create_item(factory, bit_field, configuration, cells[index])
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RegisterMap
|
|
3
|
+
class GenericMap
|
|
4
|
+
class Cell
|
|
5
|
+
Position = Struct.new(:file, :sheet, :row, :column)
|
|
6
|
+
|
|
7
|
+
def initialize(file, sheet, row, column)
|
|
8
|
+
@position = Position.new(file, sheet, row, column)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
attr_accessor :value
|
|
12
|
+
attr_reader :position
|
|
13
|
+
|
|
14
|
+
def empty?
|
|
15
|
+
value.to_s.empty?
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class Sheet
|
|
20
|
+
def initialize(file, name)
|
|
21
|
+
@file = file
|
|
22
|
+
@name = name
|
|
23
|
+
@rows = []
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
attr_reader :name
|
|
27
|
+
attr_reader :rows
|
|
28
|
+
|
|
29
|
+
def [](row, column)
|
|
30
|
+
rows[row] ||= []
|
|
31
|
+
rows[row][column] ||= Cell.new(@file, name, row, column)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def []=(row, column, value)
|
|
35
|
+
self[row, column].value = value
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def initialize(file)
|
|
40
|
+
@file = file
|
|
41
|
+
@sheets = {}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
attr_reader :file
|
|
45
|
+
|
|
46
|
+
def [](sheet_name_or_index)
|
|
47
|
+
case sheet_name_or_index
|
|
48
|
+
when String
|
|
49
|
+
@sheets[sheet_name_or_index] ||= Sheet.new(file, sheet_name_or_index)
|
|
50
|
+
when Integer
|
|
51
|
+
sheets[sheet_name_or_index]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def []=(sheet_name, table)
|
|
56
|
+
@sheets[sheet_name] = Sheet.new(file, sheet_name)
|
|
57
|
+
table.each_with_index do |values, row|
|
|
58
|
+
values.each_with_index do |value, column|
|
|
59
|
+
@sheets[sheet_name][row, column] = value
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def sheets
|
|
65
|
+
@sheets.values
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RegisterMap
|
|
3
|
+
class Item < InputBase::Item
|
|
4
|
+
include Base::HierarchicalItemAccessors
|
|
5
|
+
include RaiseError
|
|
6
|
+
|
|
7
|
+
attr_reader :configuration
|
|
8
|
+
attr_reader :position
|
|
9
|
+
|
|
10
|
+
def initialize(owner)
|
|
11
|
+
super(owner)
|
|
12
|
+
define_hierarchical_item_accessors
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def build(configuration, cell)
|
|
16
|
+
@configuration = configuration
|
|
17
|
+
@position = cell.position
|
|
18
|
+
super(cell.value)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RegisterMap
|
|
3
|
+
class ItemFactory < InputBase::ItemFactory
|
|
4
|
+
include RaiseError
|
|
5
|
+
|
|
6
|
+
def create(component, configuration, cell = nil)
|
|
7
|
+
item = create_item(component, cell)
|
|
8
|
+
item.build(configuration, cell) unless cell.nil?
|
|
9
|
+
item
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RegisterMap
|
|
3
|
+
module RaiseError
|
|
4
|
+
private
|
|
5
|
+
|
|
6
|
+
def error(message, cell_or_position = nil)
|
|
7
|
+
error_position =
|
|
8
|
+
case cell_or_position
|
|
9
|
+
when GenericMap::Cell::Position then cell_or_position
|
|
10
|
+
when GenericMap::Cell then cell_or_position.position
|
|
11
|
+
else @position
|
|
12
|
+
end
|
|
13
|
+
fail RgGen::RegisterMapError.new(message, error_position)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RegisterMap
|
|
3
|
+
class RegisterBlockFactory < InputBase::ComponentFactory
|
|
4
|
+
def create_active_items(register_block, configuration, sheet)
|
|
5
|
+
active_item_factories.each_value.with_index do |factory, index|
|
|
6
|
+
cell = sheet[index, 2]
|
|
7
|
+
create_item(factory, register_block, configuration, cell)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def create_children(register_block, configuration, sheet)
|
|
12
|
+
cell_blocks(sheet).each do |block|
|
|
13
|
+
create_child(register_block, configuration, block)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def cell_blocks(sheet)
|
|
18
|
+
drop_row_size = active_item_factories.size + 2
|
|
19
|
+
drop_column_size = 1
|
|
20
|
+
sheet.rows.drop(drop_row_size).each_with_object([]) do |row, blocks|
|
|
21
|
+
valid_cells = row.drop(drop_column_size)
|
|
22
|
+
next if valid_cells.all?(&:empty?)
|
|
23
|
+
blocks << [] unless valid_cells.first.empty?
|
|
24
|
+
blocks.last << valid_cells
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RegisterMap
|
|
3
|
+
class RegisterFactory < InputBase::ComponentFactory
|
|
4
|
+
def create_active_items(register, configuration, rows)
|
|
5
|
+
active_item_factories.each_value.with_index do |factory, index|
|
|
6
|
+
create_item(factory, register, configuration, rows.first[index])
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def create_children(register, configuration, rows)
|
|
11
|
+
drop_size = active_item_factories.size
|
|
12
|
+
rows.each do |row|
|
|
13
|
+
create_child(register, configuration, row.drop(drop_size))
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RegisterMap
|
|
3
|
+
class RegisterMapFactory < InputBase::ComponentFactory
|
|
4
|
+
def create_children(register_map, configuration, map)
|
|
5
|
+
map.sheets.each do |sheet|
|
|
6
|
+
create_child(register_map, configuration, sheet)
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def load(file)
|
|
11
|
+
map = load_file(file)
|
|
12
|
+
if map.is_a?(GenericMap)
|
|
13
|
+
map
|
|
14
|
+
else
|
|
15
|
+
message = "GenericMap type required for register map: #{map.class}"
|
|
16
|
+
fail RgGen::LoadError, message
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RegisterMap
|
|
3
|
+
input_component_store :register_map do
|
|
4
|
+
entry do
|
|
5
|
+
component_class Component
|
|
6
|
+
component_factory RegisterMapFactory
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
entry :register_block do
|
|
10
|
+
component_class Component
|
|
11
|
+
component_factory RegisterBlockFactory
|
|
12
|
+
item_base Item
|
|
13
|
+
item_factory ItemFactory
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
entry :register do
|
|
17
|
+
component_class Component
|
|
18
|
+
component_factory RegisterFactory
|
|
19
|
+
item_base Item
|
|
20
|
+
item_factory ItemFactory
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
entry :bit_field do
|
|
24
|
+
component_class Component
|
|
25
|
+
component_factory BitFieldFactory
|
|
26
|
+
item_base Item
|
|
27
|
+
item_factory ItemFactory
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
loader_base Loader
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module RTL
|
|
3
|
+
class Component < OutputBase::Component
|
|
4
|
+
def build
|
|
5
|
+
super
|
|
6
|
+
@items.each do |item|
|
|
7
|
+
def_object_delegators(item, *item.identifiers)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def signal_declarations
|
|
12
|
+
[*@items, *@children].flat_map(&:signal_declarations)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def port_declarations
|
|
16
|
+
[*@items, *@children].flat_map(&:port_declarations)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def parameter_declarations
|
|
20
|
+
[*@items, *@children].flat_map(&:parameter_declarations)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def localparam_declarations
|
|
24
|
+
[*@items, *@children].flat_map(&:localparam_declarations)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|