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