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,42 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module Builder
|
|
3
|
+
class ComponentStore
|
|
4
|
+
def initialize(builder, component_name)
|
|
5
|
+
@builder = builder
|
|
6
|
+
@component_name = component_name
|
|
7
|
+
@entries = []
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def entry(associated_category_or_categories = nil, &body)
|
|
11
|
+
if associated_category_or_categories.nil?
|
|
12
|
+
@entries << create_new_entry(nil, body)
|
|
13
|
+
else
|
|
14
|
+
Array(associated_category_or_categories).each do |category|
|
|
15
|
+
@entries << create_new_entry(category, body)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def build_factory
|
|
21
|
+
factories = @entries.map(&:build_factory)
|
|
22
|
+
factories.each_cons(2) do |factory_pair|
|
|
23
|
+
factory_pair[0].child_factory = factory_pair[1]
|
|
24
|
+
end
|
|
25
|
+
factories.first.root_factory
|
|
26
|
+
factories.first
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def create_new_entry(associated_category, body)
|
|
32
|
+
ComponentEntry.new.tap do |new_entry|
|
|
33
|
+
new_entry.instance_exec(&body)
|
|
34
|
+
@builder.categories.each do |name, category|
|
|
35
|
+
next if associated_category && name != associated_category
|
|
36
|
+
category.add_item_store(@component_name, new_entry.item_store)
|
|
37
|
+
end if new_entry.item_store
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module Builder
|
|
3
|
+
class InputComponentStore < ComponentStore
|
|
4
|
+
def initialize(builder, component_name)
|
|
5
|
+
super(builder, component_name)
|
|
6
|
+
@loaders = []
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
attr_setter :loader_base
|
|
10
|
+
|
|
11
|
+
def define_loader(type_or_types, &body)
|
|
12
|
+
return unless loader_base
|
|
13
|
+
@loaders << Class.new(loader_base, &body).tap do |l|
|
|
14
|
+
l.supported_types = Array(type_or_types)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def build_factory
|
|
19
|
+
super.tap do |f|
|
|
20
|
+
f.loaders = @loaders
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module Builder
|
|
3
|
+
class ItemStore
|
|
4
|
+
def initialize(base, factory)
|
|
5
|
+
@base = base
|
|
6
|
+
@factory = factory
|
|
7
|
+
@simple_item_entries = {}
|
|
8
|
+
@list_item_entries = {}
|
|
9
|
+
@enabled_entries = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
attr_reader :base
|
|
13
|
+
attr_reader :factory
|
|
14
|
+
|
|
15
|
+
def define_simple_item(context, item_name, &body)
|
|
16
|
+
create_item_entry(:simple, item_name, context, body)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def define_list_item(context, list_name, item_name = nil, &body)
|
|
20
|
+
if item_name.nil?
|
|
21
|
+
create_item_entry(:list, list_name, context, body)
|
|
22
|
+
else
|
|
23
|
+
define_list_item_class(list_name, item_name, context, body)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def enable(*args)
|
|
28
|
+
case args.size
|
|
29
|
+
when 1
|
|
30
|
+
enable_item_entries(args[0])
|
|
31
|
+
when 2
|
|
32
|
+
enable_list_item(args[0], args[1])
|
|
33
|
+
else
|
|
34
|
+
message = "wrong number of arguments (#{args.size} for 1..2)"
|
|
35
|
+
fail ArgumentError, message
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def build_factories
|
|
40
|
+
@enabled_entries.each_with_object({}) do |entry_name, factories|
|
|
41
|
+
factories[entry_name] = (
|
|
42
|
+
@simple_item_entries[entry_name] || @list_item_entries[entry_name]
|
|
43
|
+
).build_factory
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def create_item_entry(entry_type, entry_name, context, body)
|
|
50
|
+
klass = { simple: SimpleItemEntry, list: ListItemEntry }[entry_type]
|
|
51
|
+
entry = klass.new(base, factory, context, &body)
|
|
52
|
+
update_entries(entry_type, entry_name, entry)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def update_entries(entry_type, entry_name, entry)
|
|
56
|
+
if entry_type == :simple
|
|
57
|
+
@list_item_entries.delete(entry_name)
|
|
58
|
+
@simple_item_entries[entry_name] = entry
|
|
59
|
+
else
|
|
60
|
+
@simple_item_entries.delete(entry_name)
|
|
61
|
+
@list_item_entries[entry_name] = entry
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def define_list_item_class(list_name, item_name, context, body)
|
|
66
|
+
unless @list_item_entries.key?(list_name)
|
|
67
|
+
message = "undefined list item entry: #{list_name}"
|
|
68
|
+
fail RgGen::BuilderError, message
|
|
69
|
+
end
|
|
70
|
+
entry = @list_item_entries[list_name]
|
|
71
|
+
entry.define_list_item(item_name, context, &body)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def enable_item_entries(entry_name_or_names)
|
|
75
|
+
Array(entry_name_or_names).each do |entry_name|
|
|
76
|
+
next if @enabled_entries.include?(entry_name)
|
|
77
|
+
next unless @simple_item_entries.key?(entry_name) ||
|
|
78
|
+
@list_item_entries.key?(entry_name)
|
|
79
|
+
@enabled_entries << entry_name
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def enable_list_item(list_name, item_name_or_names)
|
|
84
|
+
return unless @list_item_entries.key?(list_name)
|
|
85
|
+
@list_item_entries[list_name].enable(item_name_or_names)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module Builder
|
|
3
|
+
class ListItemEntry
|
|
4
|
+
def initialize(item_base, factory_base, context, &body)
|
|
5
|
+
@item_base = Class.new(item_base)
|
|
6
|
+
@factory = Class.new(factory_base)
|
|
7
|
+
@items = {}
|
|
8
|
+
@enabled_items = []
|
|
9
|
+
unless context.nil?
|
|
10
|
+
set_context(@item_base , context)
|
|
11
|
+
set_context(@factory , context)
|
|
12
|
+
set_context(singleton_class, context)
|
|
13
|
+
end
|
|
14
|
+
instance_exec(&body) if block_given?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def item_base(&body)
|
|
18
|
+
@item_base.class_exec(&body) if block_given?
|
|
19
|
+
@item_base
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def item_class(&body)
|
|
23
|
+
@item_class ||= Class.new(@item_base)
|
|
24
|
+
@item_class.class_exec(&body) if block_given?
|
|
25
|
+
@item_class
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
alias_method :default_item, :item_class
|
|
29
|
+
|
|
30
|
+
def factory(&body)
|
|
31
|
+
@factory.class_exec(&body) if block_given?
|
|
32
|
+
@factory
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def define_list_item(item_name, context, &body)
|
|
36
|
+
klass = Class.new(item_base)
|
|
37
|
+
unless context.nil?
|
|
38
|
+
if item_base.private_method_defined?(:shared_context)
|
|
39
|
+
fail BuilderError, 'base class already has #shared_context'
|
|
40
|
+
end
|
|
41
|
+
set_context(klass, context)
|
|
42
|
+
end
|
|
43
|
+
klass.class_exec(&body)
|
|
44
|
+
@items[item_name] = klass
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def enable(item_or_items)
|
|
48
|
+
Array(item_or_items).each do |item|
|
|
49
|
+
next unless @items.key?(item)
|
|
50
|
+
next if @enabled_items.include?(item)
|
|
51
|
+
@enabled_items << item
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def build_factory
|
|
56
|
+
@factory.new.tap do |f|
|
|
57
|
+
f.target_items = target_items
|
|
58
|
+
f.target_item = @item_class unless @item_class.nil?
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def target_items
|
|
65
|
+
return nil if @enabled_items.empty?
|
|
66
|
+
@enabled_items.each_with_object({}) do |item_name, items|
|
|
67
|
+
items[item_name] = @items[item_name]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def set_context(klass, context)
|
|
72
|
+
klass.class_exec do
|
|
73
|
+
define_method(:shared_context) do
|
|
74
|
+
context
|
|
75
|
+
end
|
|
76
|
+
private :shared_context
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module RgGen
|
|
2
|
+
module Builder
|
|
3
|
+
class SimpleItemEntry
|
|
4
|
+
def initialize(base, factory, context, &body)
|
|
5
|
+
@item_class = define_item_class(base, context, body)
|
|
6
|
+
@factory = factory
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
attr_reader :item_class
|
|
10
|
+
attr_reader :factory
|
|
11
|
+
|
|
12
|
+
def build_factory
|
|
13
|
+
@factory.new.tap do |f|
|
|
14
|
+
f.target_item = @item_class
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def define_item_class(base, context, body)
|
|
21
|
+
klass = Class.new(base)
|
|
22
|
+
klass.class_exec do
|
|
23
|
+
define_method(:shared_context) do
|
|
24
|
+
context
|
|
25
|
+
end
|
|
26
|
+
private :shared_context
|
|
27
|
+
end unless context.nil?
|
|
28
|
+
klass.class_exec(&body) unless body.nil?
|
|
29
|
+
klass
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
simple_item :bit_field, :bit_assignment do
|
|
2
|
+
register_map do
|
|
3
|
+
field :msb
|
|
4
|
+
field :lsb
|
|
5
|
+
field :width do
|
|
6
|
+
msb - lsb + 1
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
input_pattern %r{\[(#{number})(?::(#{number}))?\]}
|
|
10
|
+
|
|
11
|
+
build do |cell|
|
|
12
|
+
parse_bit_assignment(cell)
|
|
13
|
+
case
|
|
14
|
+
when @lsb > @msb
|
|
15
|
+
error "lsb is larger than msb: #{cell}"
|
|
16
|
+
when @msb >= configuration.data_width
|
|
17
|
+
error "exceeds the data width(#{configuration.data_width}): #{cell}"
|
|
18
|
+
when overlapped_bit_assignment?
|
|
19
|
+
error "overlapped bit assignment: #{cell}"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def parse_bit_assignment(cell)
|
|
24
|
+
if pattern_matched?
|
|
25
|
+
@msb, @lsb = captures.compact.map(&method(:Integer))
|
|
26
|
+
@lsb ||= @msb
|
|
27
|
+
else
|
|
28
|
+
error "invalid value for bit assignment: #{cell.inspect}"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def overlapped_bit_assignment?
|
|
33
|
+
own_range = @lsb..@msb
|
|
34
|
+
register.bit_fields.any? do |bit_field|
|
|
35
|
+
own_range.overlap?(bit_field.lsb..bit_field.msb)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
simple_item :bit_field, :field_model_creation do
|
|
2
|
+
ral do
|
|
3
|
+
delegate [:name, :width, :lsb, :access] => :bit_field
|
|
4
|
+
|
|
5
|
+
generate_code :field_model_creation do
|
|
6
|
+
"`rggen_ral_create_field_model(#{arguments.join(', ')})\n"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def arguments
|
|
10
|
+
[name, string(name), width, lsb, access, volatile, reset, has_reset]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def volatile
|
|
14
|
+
0
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def reset
|
|
18
|
+
hex(bit_field.initial_value || 0, width)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def has_reset
|
|
22
|
+
(bit_field.initial_value? && 1) || 0
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
simple_item :bit_field, :initial_value do
|
|
2
|
+
register_map do
|
|
3
|
+
field :initial_value
|
|
4
|
+
field :initial_value? do
|
|
5
|
+
@initial_value.not_nil?
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
build do |cell|
|
|
9
|
+
@initial_value = parse_initial_value(cell)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
validate do
|
|
13
|
+
if initial_value? && valid_range.exclude?(@initial_value)
|
|
14
|
+
error "out of valid initial value range(#{valid_range}):" \
|
|
15
|
+
" #{@initial_value}"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def parse_initial_value(cell)
|
|
20
|
+
return if empty?(cell)
|
|
21
|
+
Integer(cell)
|
|
22
|
+
rescue
|
|
23
|
+
error "invalid value for initial value: #{cell.inspect}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def empty?(cell)
|
|
27
|
+
cell.to_s.strip.empty?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def valid_range
|
|
31
|
+
min_value = -1 * (2**bit_field.width) / 2
|
|
32
|
+
max_value = 2**bit_field.width - 1
|
|
33
|
+
(min_value..max_value)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
simple_item :bit_field, :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 bit field 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 bit field name: #{cell.inspect}"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def repeated_name?
|
|
21
|
+
register_block.bit_fields.any? do |bit_field|
|
|
22
|
+
@name == bit_field.name
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
simple_item :bit_field, :reference do
|
|
2
|
+
register_map do
|
|
3
|
+
field :reference, need_validation: true, forward_to: :find_reference
|
|
4
|
+
field :has_reference? do
|
|
5
|
+
@reference.not.empty?
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
build do |cell|
|
|
9
|
+
@reference = cell.to_s
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
validate do
|
|
13
|
+
case
|
|
14
|
+
when @reference == bit_field.name
|
|
15
|
+
error "self reference: #{@reference}"
|
|
16
|
+
when not_find_reference?
|
|
17
|
+
error "no such reference bit field: #{@reference}"
|
|
18
|
+
when refer_reserved_bit_field?
|
|
19
|
+
error "reserved bit field is refered: #{@reference}"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def not_find_reference?
|
|
24
|
+
return false unless has_reference?
|
|
25
|
+
find_reference.nil?
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def refer_reserved_bit_field?
|
|
29
|
+
return false unless has_reference?
|
|
30
|
+
find_reference.reserved?
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def find_reference
|
|
36
|
+
return nil unless has_reference?
|
|
37
|
+
@found_reference ||= register_block.bit_fields.find do |bit_field|
|
|
38
|
+
bit_field.name == @reference
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
list_item :bit_field, :type, :ro do
|
|
2
|
+
register_map do
|
|
3
|
+
read_only
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
rtl do
|
|
7
|
+
build do
|
|
8
|
+
input :value_in, name: port_name, width: width, dimensions: dimensions
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
generate_code :module_item do |buffer|
|
|
12
|
+
buffer << assign(value[loop_variables], value_in[loop_variables]) << nl
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def port_name
|
|
16
|
+
"i_#{bit_field.name}"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
rggen_bit_field_rw #(
|
|
2
|
+
.WIDTH (<%= bit_field.width %>),
|
|
3
|
+
.INITIAL_VALUE (<%= initial_value %>)
|
|
4
|
+
) u_<%= bit_field.name %> (
|
|
5
|
+
.clk (<%= register_block.clock %>),
|
|
6
|
+
.rst_n (<%= register_block.reset %>),
|
|
7
|
+
.i_command_valid (<%= register_block.host_if.command_valid %>),
|
|
8
|
+
.i_select (<%= register_block.register_select[index] %>),
|
|
9
|
+
.i_write (<%= register_block.host_if.write %>),
|
|
10
|
+
.i_write_data (<%= register_block.host_if.write_data[bit_field.msb, bit_field.lsb] %>),
|
|
11
|
+
.i_write_mask (<%= register_block.host_if.write_mask[bit_field.msb, bit_field.lsb] %>),
|
|
12
|
+
.o_value (<%= value[loop_variables] %>)
|
|
13
|
+
);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
list_item :bit_field, :type, :rw do
|
|
2
|
+
register_map do
|
|
3
|
+
read_write
|
|
4
|
+
need_initial_value
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
rtl do
|
|
8
|
+
build do
|
|
9
|
+
output :value_out, name: port_name, width: width, dimensions: dimensions
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
generate_code :module_item do |buffer|
|
|
13
|
+
buffer << assign(value_out[loop_variables], value[loop_variables]) << nl
|
|
14
|
+
buffer << process_template
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def port_name
|
|
18
|
+
"o_#{bit_field.name}"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def initial_value
|
|
22
|
+
hex(bit_field.initial_value, bit_field.width)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|