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,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
|