rggen 0.7.2 → 0.8.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 +4 -4
- data/lib/rggen/builtins.rb +2 -1
- data/lib/rggen/builtins/bit_field/type.rb +3 -5
- data/lib/rggen/builtins/bit_field/types/ro.rb +5 -3
- data/lib/rggen/builtins/bit_field/types/rw.rb +5 -3
- data/lib/rggen/builtins/bit_field/types/rwl_rwe.rb +5 -3
- data/lib/rggen/builtins/bit_field/types/w0c_w1c.erb +1 -1
- data/lib/rggen/builtins/bit_field/types/w0c_w1c.rb +11 -5
- data/lib/rggen/builtins/bit_field/types/w0s_w1s.rb +10 -6
- data/lib/rggen/builtins/global/array_port_format.rb +15 -0
- data/lib/rggen/builtins/global/unfold_sv_interface_port.rb +22 -0
- data/lib/rggen/builtins/register/type.rb +10 -4
- data/lib/rggen/builtins/register/types/external.rb +56 -5
- data/lib/rggen/builtins/register_block/clock_reset.rb +2 -2
- data/lib/rggen/builtins/register_block/host_if.rb +1 -1
- data/lib/rggen/builtins/register_block/host_ifs/apb.rb +44 -4
- data/lib/rggen/builtins/register_block/host_ifs/axi4lite.rb +76 -7
- data/lib/rggen/builtins/register_block/rtl_top.rb +17 -7
- data/lib/rggen/core_components.rb +3 -3
- data/lib/rggen/core_components/ral/item.rb +16 -15
- data/lib/rggen/core_components/rtl/component.rb +0 -4
- data/lib/rggen/core_components/rtl/item.rb +27 -32
- data/lib/rggen/core_components/verilog_utility.rb +6 -6
- data/lib/rggen/core_components/verilog_utility/class_definition.rb +11 -11
- data/lib/rggen/core_components/verilog_utility/identifier.rb +49 -17
- data/lib/rggen/core_components/verilog_utility/{interface_instantiation.rb → interface_instance.rb} +7 -3
- data/lib/rggen/core_components/verilog_utility/{interface_port_declaration.rb → interface_port.rb} +7 -3
- data/lib/rggen/core_components/verilog_utility/local_scope.rb +8 -4
- data/lib/rggen/core_components/verilog_utility/module_definition.rb +20 -9
- data/lib/rggen/core_components/verilog_utility/package_definition.rb +15 -23
- data/lib/rggen/core_components/verilog_utility/structure_definition.rb +7 -6
- data/lib/rggen/core_components/verilog_utility/variable.rb +115 -0
- data/lib/rggen/version.rb +2 -2
- data/rtl/compile.f +0 -3
- data/rtl/rggen_address_decoder.sv +2 -2
- data/rtl/rggen_bus_splitter.sv +2 -2
- data/rtl/rggen_external_register.sv +2 -2
- data/rtl/rggen_host_if_apb.sv +2 -2
- data/rtl/rggen_indirect_register.sv +3 -3
- data/sample/sample.json +3 -1
- data/sample/sample.yaml +2 -0
- data/sample/sample_0.sv +30 -42
- data/sample/sample_1.sv +13 -13
- data/sample/sample_setup.rb +2 -2
- data/setup/default.rb +2 -2
- metadata +7 -9
- data/lib/rggen/builtins/register_block/irq_controller.erb +0 -9
- data/lib/rggen/builtins/register_block/irq_controller.rb +0 -43
- data/lib/rggen/builtins/register_block/rtl_top.erb +0 -7
- data/lib/rggen/core_components/verilog_utility/declaration.rb +0 -76
- data/rtl/rggen_irq_controller.sv +0 -21
@@ -6,9 +6,9 @@ define_simple_item :register_block, :rtl_top do
|
|
6
6
|
|
7
7
|
def source_file_body
|
8
8
|
module_definition register_block.name do |m|
|
9
|
-
m.parameters
|
10
|
-
m.ports
|
11
|
-
m.signals
|
9
|
+
m.parameters register_block.parameter_declarations(:register_block)
|
10
|
+
m.ports register_block.port_declarations(:register_block)
|
11
|
+
m.signals register_block.signal_declarations(:register_block)
|
12
12
|
m.body { |code| module_body(code) }
|
13
13
|
end
|
14
14
|
end
|
@@ -17,12 +17,22 @@ define_simple_item :register_block, :rtl_top do
|
|
17
17
|
register_block.generate_code(:register_block, :top_down, code)
|
18
18
|
end
|
19
19
|
|
20
|
-
generate_pre_code :register_block do
|
21
|
-
|
20
|
+
generate_pre_code :register_block do |code|
|
21
|
+
[
|
22
|
+
'`define rggen_connect_bit_field_if(RIF, FIF, MSB, LSB) \\',
|
23
|
+
'assign FIF.read_access = RIF.read_access; \\',
|
24
|
+
'assign FIF.write_access = RIF.write_access; \\',
|
25
|
+
'assign FIF.write_data = RIF.write_data[MSB:LSB]; \\',
|
26
|
+
'assign FIF.write_mask = RIF.write_mask[MSB:LSB]; \\',
|
27
|
+
'assign RIF.value[MSB:LSB] = FIF.value; \\',
|
28
|
+
'assign RIF.read_data[MSB:LSB] = FIF.read_data;'
|
29
|
+
].each do |line|
|
30
|
+
code << line << nl
|
31
|
+
end
|
22
32
|
end
|
23
33
|
|
24
|
-
generate_post_code :register_block do
|
25
|
-
:'`undef rggen_connect_bit_field_if'
|
34
|
+
generate_post_code :register_block do |code|
|
35
|
+
code << :'`undef rggen_connect_bit_field_if' << nl
|
26
36
|
end
|
27
37
|
end
|
28
38
|
end
|
@@ -6,15 +6,15 @@ require_relative 'core_components/code_utility/source_file'
|
|
6
6
|
require_relative 'core_components/code_utility'
|
7
7
|
|
8
8
|
require_relative 'core_components/verilog_utility/identifier'
|
9
|
-
require_relative 'core_components/verilog_utility/
|
9
|
+
require_relative 'core_components/verilog_utility/variable'
|
10
10
|
require_relative 'core_components/verilog_utility/structure_definition'
|
11
11
|
require_relative 'core_components/verilog_utility/local_scope'
|
12
12
|
require_relative 'core_components/verilog_utility/module_definition'
|
13
13
|
require_relative 'core_components/verilog_utility/package_definition'
|
14
14
|
require_relative 'core_components/verilog_utility/class_definition'
|
15
15
|
require_relative 'core_components/verilog_utility/subroutine_definition'
|
16
|
-
require_relative 'core_components/verilog_utility/
|
17
|
-
require_relative 'core_components/verilog_utility/
|
16
|
+
require_relative 'core_components/verilog_utility/interface_instance'
|
17
|
+
require_relative 'core_components/verilog_utility/interface_port'
|
18
18
|
require_relative 'core_components/verilog_utility/source_file'
|
19
19
|
require_relative 'core_components/verilog_utility'
|
20
20
|
|
@@ -15,12 +15,12 @@ module RgGen
|
|
15
15
|
|
16
16
|
class << self
|
17
17
|
private
|
18
|
-
|
19
18
|
def define_declaration_method(method_name)
|
20
19
|
define_method(method_name) do |domain, handle_name, attributes = {}|
|
21
20
|
attributes[:name] ||= handle_name
|
22
|
-
|
23
|
-
add_declaration(method_name, domain,
|
21
|
+
declaration = create_declaration(method_name, attributes)
|
22
|
+
add_declaration(method_name, domain, declaration)
|
23
|
+
add_identifier(handle_name, declaration.identifier)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -29,29 +29,30 @@ module RgGen
|
|
29
29
|
define_declaration_method :parameter
|
30
30
|
|
31
31
|
def variable_declarations(domain = nil)
|
32
|
-
return @variable_declarations
|
32
|
+
domain || (return @variable_declarations)
|
33
33
|
@variable_declarations[domain]
|
34
34
|
end
|
35
35
|
|
36
36
|
def parameter_declarations(domain = nil)
|
37
|
-
return @parameter_declarations
|
37
|
+
domain || (return @parameter_declarations)
|
38
38
|
@parameter_declarations[domain]
|
39
39
|
end
|
40
40
|
|
41
41
|
private
|
42
42
|
|
43
|
-
def
|
44
|
-
|
45
|
-
instance_variable_set(handle_name.variablize, i)
|
46
|
-
attr_singleton_reader(handle_name)
|
47
|
-
identifiers << handle_name
|
48
|
-
end
|
43
|
+
def create_declaration(type, attributes)
|
44
|
+
__send__("#{type}_declaration", attributes)
|
49
45
|
end
|
50
46
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
47
|
+
def add_identifier(handle_name, identifier)
|
48
|
+
instance_variable_set(handle_name.variablize, identifier)
|
49
|
+
attr_singleton_reader(handle_name)
|
50
|
+
identifiers << handle_name
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_declaration(type, domain, declaration)
|
54
|
+
list = instance_variable_get("@#{type}_declarations")
|
55
|
+
list[domain] << declaration
|
55
56
|
end
|
56
57
|
end
|
57
58
|
end
|
@@ -19,10 +19,6 @@ module RgGen
|
|
19
19
|
def parameter_declarations(domain)
|
20
20
|
[*@items, *@children].flat_map { |o| o.parameter_declarations(domain) }
|
21
21
|
end
|
22
|
-
|
23
|
-
def localparam_declarations(domain)
|
24
|
-
[*@items, *@children].flat_map { |o| o.localparam_declarations(domain) }
|
25
|
-
end
|
26
22
|
end
|
27
23
|
end
|
28
24
|
end
|
@@ -10,15 +10,13 @@ module RgGen
|
|
10
10
|
@signal_declarations = Hash.new { |h, d| h[d] = [] }
|
11
11
|
@port_declarations = Hash.new { |h, d| h[d] = [] }
|
12
12
|
@parameter_declarations = Hash.new { |h, d| h[d] = [] }
|
13
|
-
@localparam_declarations = Hash.new { |h, d| h[d] = [] }
|
14
13
|
end
|
15
14
|
|
16
15
|
attr_reader :identifiers
|
17
16
|
|
18
|
-
def_delegator :@signal_declarations
|
19
|
-
def_delegator :@port_declarations
|
20
|
-
def_delegator :@parameter_declarations
|
21
|
-
def_delegator :@localparam_declarations, :[], :localparam_declarations
|
17
|
+
def_delegator :@signal_declarations , :[], :signal_declarations
|
18
|
+
def_delegator :@port_declarations , :[], :port_declarations
|
19
|
+
def_delegator :@parameter_declarations, :[], :parameter_declarations
|
22
20
|
|
23
21
|
class << self
|
24
22
|
private
|
@@ -26,8 +24,9 @@ module RgGen
|
|
26
24
|
def define_declaration_method(method_name)
|
27
25
|
define_method(method_name) do |domain, handle_name, attributes = {}|
|
28
26
|
attributes[:name] ||= handle_name
|
29
|
-
|
30
|
-
add_declaration(method_name, domain,
|
27
|
+
declaration = create_declaration(method_name, attributes)
|
28
|
+
add_declaration(method_name, domain, declaration)
|
29
|
+
add_identifier(handle_name, declaration.identifier)
|
31
30
|
end
|
32
31
|
private method_name
|
33
32
|
end
|
@@ -45,41 +44,37 @@ module RgGen
|
|
45
44
|
|
46
45
|
private
|
47
46
|
|
48
|
-
def
|
47
|
+
def create_declaration(type, attributes)
|
49
48
|
case type
|
50
49
|
when :wire, :reg, :logic
|
51
|
-
|
50
|
+
variable_declaration(attributes.merge(data_type: type))
|
52
51
|
when :interface
|
53
|
-
|
52
|
+
interface_instance(attributes)
|
54
53
|
when :input, :output
|
55
|
-
|
54
|
+
port_declaration(attributes.merge(direction: type))
|
56
55
|
when :interface_port
|
57
|
-
|
58
|
-
when :parameter
|
59
|
-
|
60
|
-
when :localparam
|
61
|
-
@localparam_declarations[domain] << parameter_declaration(type, attributes)
|
56
|
+
interface_port_declaration(attributes)
|
57
|
+
when :parameter, :localparam
|
58
|
+
parameter_declaration(attributes.merge(parameter_type: type))
|
62
59
|
end
|
63
60
|
end
|
64
61
|
|
65
|
-
def
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
62
|
+
def add_declaration(type, domain, declaration)
|
63
|
+
declarations =
|
64
|
+
case type
|
65
|
+
when :wire, :reg, :logic, :interface
|
66
|
+
@signal_declarations[domain]
|
67
|
+
when :input, :output, :interface_port
|
68
|
+
@port_declarations[domain]
|
69
|
+
when :parameter, :localparam
|
70
|
+
@parameter_declarations[domain]
|
71
|
+
end
|
72
|
+
declarations << declaration
|
75
73
|
end
|
76
74
|
|
77
|
-
def add_identifier(handle_name,
|
78
|
-
identifier
|
79
|
-
|
80
|
-
instance_variable_set(handle_name.variablize, identifier)
|
81
|
-
attr_singleton_reader(handle_name)
|
82
|
-
end
|
75
|
+
def add_identifier(handle_name, identifier)
|
76
|
+
instance_variable_set(handle_name.variablize, identifier)
|
77
|
+
attr_singleton_reader(handle_name)
|
83
78
|
identifiers << handle_name
|
84
79
|
end
|
85
80
|
end
|
@@ -13,23 +13,23 @@ module RgGen
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def variable_declaration(attributes)
|
16
|
-
|
16
|
+
Variable.new(:variable, attributes)
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
|
19
|
+
def interface_instance(attributes)
|
20
|
+
InterfaceInstance.new(attributes)
|
21
21
|
end
|
22
22
|
|
23
23
|
def port_declaration(attributes)
|
24
|
-
|
24
|
+
Variable.new(:port, attributes)
|
25
25
|
end
|
26
26
|
|
27
27
|
def interface_port_declaration(attributes)
|
28
|
-
|
28
|
+
InterfacePort.new(attributes)
|
29
29
|
end
|
30
30
|
|
31
31
|
def parameter_declaration(attributes)
|
32
|
-
|
32
|
+
Variable.new(:parameter, attributes)
|
33
33
|
end
|
34
34
|
|
35
35
|
def module_definition(name, &body)
|
@@ -5,22 +5,24 @@ module RgGen
|
|
5
5
|
attr_setter :parameters
|
6
6
|
attr_setter :variables
|
7
7
|
|
8
|
-
def to_code
|
9
|
-
bodies.unshift(variables_declarations) if variables?
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
8
|
private
|
14
9
|
|
15
10
|
def header_code
|
16
11
|
code_block do |code|
|
17
|
-
code << :class << space
|
18
|
-
paraemter_declarations(code)
|
19
|
-
code << space
|
12
|
+
code << :class << space << @name
|
13
|
+
parameters? && paraemter_declarations(code)
|
14
|
+
@base && (code << space <<:extends << space << @base)
|
20
15
|
code << semicolon
|
21
16
|
end
|
22
17
|
end
|
23
18
|
|
19
|
+
def body_code_blocks
|
20
|
+
blocks = []
|
21
|
+
variables? && (blocks << variables_declarations)
|
22
|
+
blocks.concat(super)
|
23
|
+
blocks
|
24
|
+
end
|
25
|
+
|
24
26
|
def footer_code
|
25
27
|
:endclass
|
26
28
|
end
|
@@ -46,9 +48,7 @@ module RgGen
|
|
46
48
|
|
47
49
|
def variables_declarations
|
48
50
|
lambda do |code|
|
49
|
-
variables.each
|
50
|
-
code << variable << semicolon << nl
|
51
|
-
end
|
51
|
+
variables.each { |variable| code << variable << semicolon << nl }
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
@@ -3,25 +3,30 @@ module RgGen
|
|
3
3
|
class Identifier
|
4
4
|
include InputBase::RegxpPatterns
|
5
5
|
|
6
|
-
def initialize(name)
|
7
|
-
@name
|
6
|
+
def initialize(name, width = nil, array_dimensions = nil, array_format = nil)
|
7
|
+
@name = name
|
8
|
+
@width = width
|
9
|
+
@array_dimensions = array_dimensions
|
10
|
+
@array_format = array_format || :unpacked
|
8
11
|
end
|
9
12
|
|
10
13
|
def to_s
|
11
14
|
@name.to_s
|
12
15
|
end
|
13
16
|
|
14
|
-
def [](
|
15
|
-
if
|
17
|
+
def [](array_index_or_msb, lsb = array_index_or_msb)
|
18
|
+
if array_index_or_msb.nil?
|
16
19
|
self
|
17
|
-
elsif indexes_or_msb.is_a?(Array)
|
18
|
-
indexes_or_msb.inject(self) do |identifer, index|
|
19
|
-
identifer[index]
|
20
|
-
end
|
21
|
-
elsif indexes_or_msb == lsb
|
22
|
-
Identifier.new("#{@name}[#{indexes_or_msb}]")
|
23
20
|
else
|
24
|
-
|
21
|
+
new_name =
|
22
|
+
if array_index_or_msb.is_a?(Array)
|
23
|
+
"#{@name}#{array_selection(array_index_or_msb)}"
|
24
|
+
elsif array_index_or_msb == lsb
|
25
|
+
"#{@name}[#{array_index_or_msb}]"
|
26
|
+
else
|
27
|
+
"#{@name}[#{array_index_or_msb}:#{lsb}]"
|
28
|
+
end
|
29
|
+
Identifier.new(new_name, nil, nil, nil)
|
25
30
|
end
|
26
31
|
end
|
27
32
|
|
@@ -30,17 +35,44 @@ module RgGen
|
|
30
35
|
].freeze
|
31
36
|
|
32
37
|
def method_missing(name, *args)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
Identifier.new("#{@name}.#{name}")
|
38
|
+
args.size.zero? || (return super)
|
39
|
+
TYPE_CONVERSIONS.include?(name) && (return super)
|
40
|
+
(name =~ variable_name) || (return super)
|
41
|
+
Identifier.new("#{@name}.#{name}", nil, nil, nil)
|
37
42
|
end
|
38
43
|
|
39
44
|
def respond_to_missing?(symbol, include_private)
|
40
|
-
|
41
|
-
|
45
|
+
TYPE_CONVERSIONS.include?(symbol) && (return super)
|
46
|
+
symbol =~ variable_name || (return super)
|
42
47
|
true
|
43
48
|
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def array_selection(array_index)
|
53
|
+
if @array_format == :unpacked
|
54
|
+
array_index.map { |i| "[#{i}]" }.join
|
55
|
+
else
|
56
|
+
"[#{@width}*(#{vector_index(array_index)})+:#{@width}]"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def vector_index(array_index)
|
61
|
+
index = []
|
62
|
+
array_index.zip(index_factors).reverse_each do |i, f|
|
63
|
+
index << ((index.size.zero? && i.to_s) || "#{f}*#{i}")
|
64
|
+
end
|
65
|
+
index.reverse.join('+')
|
66
|
+
end
|
67
|
+
|
68
|
+
def index_factors
|
69
|
+
factors = []
|
70
|
+
@array_dimensions.reverse.inject(1) do |elements, dimension|
|
71
|
+
factors.unshift(elements)
|
72
|
+
elements * dimension
|
73
|
+
end
|
74
|
+
factors
|
75
|
+
end
|
44
76
|
end
|
45
77
|
end
|
46
78
|
end
|
data/lib/rggen/core_components/verilog_utility/{interface_instantiation.rb → interface_instance.rb}
RENAMED
@@ -1,12 +1,16 @@
|
|
1
1
|
module RgGen
|
2
2
|
module VerilogUtility
|
3
|
-
class
|
3
|
+
class InterfaceInstance
|
4
4
|
def initialize(attributes)
|
5
5
|
@attributes = attributes
|
6
6
|
end
|
7
7
|
|
8
8
|
def to_s
|
9
|
-
"#{interface_type} #{
|
9
|
+
"#{interface_type} #{instance_identifier}()"
|
10
|
+
end
|
11
|
+
|
12
|
+
def identifier
|
13
|
+
Identifier.new(@attributes[:name], nil, nil, nil)
|
10
14
|
end
|
11
15
|
|
12
16
|
private
|
@@ -20,7 +24,7 @@ module RgGen
|
|
20
24
|
"#(#{@attributes[:parameters].join(', ')})"
|
21
25
|
end
|
22
26
|
|
23
|
-
def
|
27
|
+
def instance_identifier
|
24
28
|
"#{@attributes[:name]}#{dimensions}"
|
25
29
|
end
|
26
30
|
|
data/lib/rggen/core_components/verilog_utility/{interface_port_declaration.rb → interface_port.rb}
RENAMED
@@ -1,12 +1,16 @@
|
|
1
1
|
module RgGen
|
2
2
|
module VerilogUtility
|
3
|
-
class
|
3
|
+
class InterfacePort
|
4
4
|
def initialize(attributes)
|
5
5
|
@attributes = attributes
|
6
6
|
end
|
7
7
|
|
8
8
|
def to_s
|
9
|
-
"#{interface_type} #{
|
9
|
+
"#{interface_type} #{port_identifier}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def identifier
|
13
|
+
Identifier.new(@attributes[:name], nil, nil, nil)
|
10
14
|
end
|
11
15
|
|
12
16
|
private
|
@@ -16,7 +20,7 @@ module RgGen
|
|
16
20
|
"#{@attributes[:type]}.#{@attributes[:modport]}"
|
17
21
|
end
|
18
22
|
|
19
|
-
def
|
23
|
+
def port_identifier
|
20
24
|
"#{@attributes[:name]}#{dimensions}"
|
21
25
|
end
|
22
26
|
|