rggen 0.4.4 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +3 -2
- data/c/rggen.h +17 -0
- data/lib/rggen.rb +7 -16
- data/lib/rggen/base/item_factory.rb +2 -0
- data/lib/rggen/builtins.rb +15 -13
- data/lib/rggen/builtins/bit_field/{reserved.rb → types/reserved.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{ro.erb → types/ro.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{ro.rb → types/ro.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{rw.erb → types/rw.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{rw.rb → types/rw.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{rwl_rwe.erb → types/rwl_rwe.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{rwl_rwe.rb → types/rwl_rwe.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0c_w1c.erb → types/w0c_w1c.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0c_w1c.rb → types/w0c_w1c.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0s_w1s.erb → types/w0s_w1s.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0s_w1s.rb → types/w0s_w1s.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{wo.rb → types/wo.rb} +0 -0
- data/lib/rggen/builtins/register/address_decoder.erb +9 -9
- data/lib/rggen/builtins/register/address_decoder.rb +24 -24
- data/lib/rggen/builtins/register/array.rb +0 -22
- data/lib/rggen/builtins/register/bus_exporter.rb +10 -2
- data/lib/rggen/builtins/register/indirect_index_configurator.rb +54 -0
- data/lib/rggen/builtins/register/offset_address.rb +21 -15
- data/lib/rggen/builtins/register/read_data.rb +1 -1
- data/lib/rggen/builtins/register/reg_model.rb +5 -5
- data/lib/rggen/builtins/register/sub_block_model.rb +1 -1
- data/lib/rggen/builtins/register/type.rb +207 -0
- data/lib/rggen/builtins/register/types/external.rb +15 -0
- data/lib/rggen/builtins/register/types/indirect.rb +134 -0
- data/lib/rggen/builtins/register/uniqueness_validator.rb +10 -7
- data/lib/rggen/builtins/register_block/address_struct.rb +56 -0
- data/lib/rggen/builtins/register_block/c_header_file.rb +15 -0
- data/lib/rggen/builtins/register_block/{apb.erb → host_ifs/apb.erb} +0 -0
- data/lib/rggen/builtins/register_block/{apb.rb → host_ifs/apb.rb} +0 -0
- data/lib/rggen/builtins/register_block/{axi4lite.erb → host_ifs/axi4lite.erb} +0 -0
- data/lib/rggen/builtins/register_block/{axi4lite.rb → host_ifs/axi4lite.rb} +0 -0
- data/lib/rggen/builtins/register_block/ral_package.rb +6 -1
- data/lib/rggen/builtins/register_block/response_mux.rb +2 -2
- data/lib/rggen/builtins/register_block/top_module.rb +5 -1
- data/lib/rggen/core_components.rb +25 -0
- data/lib/rggen/core_components/c_header/item.rb +8 -0
- data/lib/rggen/core_components/c_header/setup.rb +19 -0
- data/lib/rggen/core_components/c_utility.rb +19 -0
- data/lib/rggen/core_components/c_utility/data_structure_definition.rb +62 -0
- data/lib/rggen/core_components/c_utility/source_file.rb +10 -0
- data/lib/rggen/core_components/c_utility/variable_declaration.rb +35 -0
- data/lib/rggen/core_components/code_utility.rb +56 -0
- data/lib/rggen/{output_base → core_components/code_utility}/code_block.rb +1 -1
- data/lib/rggen/{output_base → core_components/code_utility}/line.rb +1 -1
- data/lib/rggen/core_components/code_utility/source_file.rb +97 -0
- data/lib/rggen/core_components/erb_engine.rb +15 -0
- data/lib/rggen/core_components/ral/item.rb +2 -1
- data/lib/rggen/core_components/register_map/generic_map.rb +3 -1
- data/lib/rggen/core_components/rtl/item.rb +2 -1
- data/lib/rggen/core_components/verilog_utility.rb +69 -0
- data/lib/rggen/core_components/verilog_utility/class_definition.rb +56 -0
- data/lib/rggen/core_components/verilog_utility/declaration.rb +66 -0
- data/lib/rggen/core_components/verilog_utility/identifier.rb +27 -0
- data/lib/rggen/core_components/verilog_utility/module_definition.rb +71 -0
- data/lib/rggen/core_components/verilog_utility/package_definition.rb +65 -0
- data/lib/rggen/core_components/verilog_utility/source_file.rb +10 -0
- data/lib/rggen/core_components/verilog_utility/structure_definition.rb +50 -0
- data/lib/rggen/core_components/verilog_utility/subroutine_definition.rb +41 -0
- data/lib/rggen/core_extensions/facets.rb +5 -0
- data/lib/rggen/generator.rb +19 -5
- data/lib/rggen/input_base/item.rb +6 -6
- data/lib/rggen/output_base/code_generator.rb +36 -0
- data/lib/rggen/output_base/component.rb +27 -41
- data/lib/rggen/output_base/file_writer.rb +36 -0
- data/lib/rggen/output_base/item.rb +34 -100
- data/lib/rggen/output_base/template_engine.rb +24 -0
- data/lib/rggen/rggen_home.rb +3 -0
- data/lib/rggen/version.rb +2 -2
- data/ral/rggen_ral_block.svh +1 -1
- data/ral/rggen_ral_indirect_reg.svh +193 -0
- data/ral/rggen_ral_map.svh +20 -20
- data/ral/rggen_ral_pkg.sv +1 -1
- data/rtl/register/rggen_address_decoder.sv +14 -14
- data/sample/sample.csv +21 -22
- data/sample/sample.xls +0 -0
- data/sample/sample.xlsx +0 -0
- data/sample/sample_0.h +17 -0
- data/sample/sample_0.sv +92 -92
- data/sample/sample_0_ral_pkg.sv +8 -5
- data/sample/sample_1.h +9 -0
- data/sample/sample_1.sv +27 -27
- data/sample/sample_1_ral_pkg.sv +3 -0
- data/sample/sample_setup.rb +4 -2
- data/setup/default.rb +4 -2
- metadata +53 -36
- data/lib/rggen/builtins/register/accessibility.rb +0 -23
- data/lib/rggen/builtins/register/external.rb +0 -42
- data/lib/rggen/builtins/register/shadow.rb +0 -130
- data/lib/rggen/builtins/register/shadow_index_configurator.rb +0 -56
- data/lib/rggen/output_base/code_utility.rb +0 -50
- data/lib/rggen/output_base/template_utility.rb +0 -29
- data/lib/rggen/output_base/verilog_utility.rb +0 -69
- data/lib/rggen/output_base/verilog_utility/class_definition.rb +0 -58
- data/lib/rggen/output_base/verilog_utility/declaration.rb +0 -68
- data/lib/rggen/output_base/verilog_utility/identifier.rb +0 -29
- data/lib/rggen/output_base/verilog_utility/module_definition.rb +0 -73
- data/lib/rggen/output_base/verilog_utility/package_definition.rb +0 -67
- data/lib/rggen/output_base/verilog_utility/structure_definition.rb +0 -52
- data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +0 -43
- data/ral/rggen_ral_shadow_reg.svh +0 -193
@@ -1,50 +0,0 @@
|
|
1
|
-
module RgGen
|
2
|
-
module OutputBase
|
3
|
-
module CodeUtility
|
4
|
-
private
|
5
|
-
|
6
|
-
def newline
|
7
|
-
:newline
|
8
|
-
end
|
9
|
-
|
10
|
-
alias_method :nl, :newline
|
11
|
-
|
12
|
-
def comma
|
13
|
-
','
|
14
|
-
end
|
15
|
-
|
16
|
-
def semicolon
|
17
|
-
';'
|
18
|
-
end
|
19
|
-
|
20
|
-
def space(size = 1)
|
21
|
-
' ' * size
|
22
|
-
end
|
23
|
-
|
24
|
-
def code_block(indent_size = 0, &block)
|
25
|
-
CodeBlock.new.tap do |code|
|
26
|
-
code.indent = indent_size
|
27
|
-
block.call(code) if block_given?
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def indent(code_block, indent_size, &indent_block)
|
32
|
-
code_block << nl unless code_block.last_line_empty?
|
33
|
-
code_block.indent += indent_size
|
34
|
-
indent_block.call if block_given?
|
35
|
-
code_block << nl unless code_block.last_line_empty?
|
36
|
-
code_block.indent -= indent_size
|
37
|
-
end
|
38
|
-
|
39
|
-
def wrap(code_block, head, tail, &block)
|
40
|
-
code_block << head
|
41
|
-
block.call if block_given?
|
42
|
-
code_block << tail
|
43
|
-
end
|
44
|
-
|
45
|
-
def loop_index(level)
|
46
|
-
level.times.with_object('i') { |_, index| index.next! }
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module RgGen
|
2
|
-
module OutputBase
|
3
|
-
module TemplateUtility
|
4
|
-
module Extensions
|
5
|
-
def template_engines
|
6
|
-
@template_engines ||= Hash.new do |engines, path|
|
7
|
-
engines[path] = create_engine(path)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def create_engine(path)
|
14
|
-
template = File.read(path)
|
15
|
-
BabyErubis::Text.new.from_str(template, path)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.included(klass)
|
20
|
-
klass.extend(Extensions)
|
21
|
-
end
|
22
|
-
|
23
|
-
def process_template(path = nil)
|
24
|
-
path ||= File.ext(caller.first[/^(.+?):\d/, 1], 'erb')
|
25
|
-
self.class.template_engines[path].render(self)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
module RgGen
|
2
|
-
module OutputBase
|
3
|
-
module VerilogUtility
|
4
|
-
private
|
5
|
-
|
6
|
-
def create_identifier(name)
|
7
|
-
Identifier.new(name)
|
8
|
-
end
|
9
|
-
|
10
|
-
def create_declaration(declaration_type, attributes)
|
11
|
-
Declaration.new(declaration_type, attributes)
|
12
|
-
end
|
13
|
-
|
14
|
-
def module_definition(name, &body)
|
15
|
-
ModuleDefinition.new(name, &body).to_code
|
16
|
-
end
|
17
|
-
|
18
|
-
def package_definition(name, &body)
|
19
|
-
PackageDefinition.new(name, &body).to_code
|
20
|
-
end
|
21
|
-
|
22
|
-
def class_definition(name, &body)
|
23
|
-
ClassDefinition.new(name, &body).to_code
|
24
|
-
end
|
25
|
-
|
26
|
-
def function_definition(name, &body)
|
27
|
-
SubroutineDefinition.new(:function, name, &body).to_code
|
28
|
-
end
|
29
|
-
|
30
|
-
def argument(name, attributes)
|
31
|
-
attributes[:name] = name
|
32
|
-
create_declaration(:port, attributes)
|
33
|
-
end
|
34
|
-
|
35
|
-
def assign(lhs, rhs)
|
36
|
-
"assign #{lhs} = #{rhs};"
|
37
|
-
end
|
38
|
-
|
39
|
-
def subroutine_call(subroutine, arguments = nil)
|
40
|
-
"#{subroutine}(#{Array(arguments).join(', ')})"
|
41
|
-
end
|
42
|
-
|
43
|
-
def concat(expression_or_expressions)
|
44
|
-
"{#{Array(expression_or_expressions).join(', ')}}"
|
45
|
-
end
|
46
|
-
|
47
|
-
def array(expression_or_expressions)
|
48
|
-
"'#{concat(expression_or_expressions)}"
|
49
|
-
end
|
50
|
-
|
51
|
-
def string(expression)
|
52
|
-
"\"#{expression}\""
|
53
|
-
end
|
54
|
-
|
55
|
-
def bin(value, width)
|
56
|
-
format("%d'b%0*b", width, width, value)
|
57
|
-
end
|
58
|
-
|
59
|
-
def dec(value, width)
|
60
|
-
format("%d'd%d", width, value)
|
61
|
-
end
|
62
|
-
|
63
|
-
def hex(value, width)
|
64
|
-
print_width = (width + 3) / 4
|
65
|
-
format("%d'h%0*x", width, print_width, value)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
module RgGen
|
2
|
-
module OutputBase
|
3
|
-
module VerilogUtility
|
4
|
-
class ClassDefinition < StructureDefinition
|
5
|
-
attr_setter :base
|
6
|
-
attr_setter :parameters
|
7
|
-
attr_setter :variables
|
8
|
-
|
9
|
-
def to_code
|
10
|
-
bodies.unshift(variables_declarations) if variables?
|
11
|
-
super
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def header_code
|
17
|
-
code_block do |code|
|
18
|
-
code << :class << space << @name
|
19
|
-
paraemter_declarations(code) if parameters?
|
20
|
-
code << space <<:extends << space << @base unless @base.nil?
|
21
|
-
code << semicolon
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def footer_code
|
26
|
-
:endclass
|
27
|
-
end
|
28
|
-
|
29
|
-
def parameters?
|
30
|
-
!(@parameters.nil? || @parameters.empty?)
|
31
|
-
end
|
32
|
-
|
33
|
-
def variables?
|
34
|
-
!(@variables.nil? || @variables.empty?)
|
35
|
-
end
|
36
|
-
|
37
|
-
def paraemter_declarations(code)
|
38
|
-
wrap(code, '#(', ')') do
|
39
|
-
indent(code, 2) do
|
40
|
-
@parameters.each_with_index do |d, i|
|
41
|
-
code << comma << nl if i > 0
|
42
|
-
code << d
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def variables_declarations
|
49
|
-
lambda do |code|
|
50
|
-
variables.each do |variable|
|
51
|
-
code << variable << semicolon << nl
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
module RgGen
|
2
|
-
module OutputBase
|
3
|
-
module VerilogUtility
|
4
|
-
class Declaration
|
5
|
-
def initialize(declation_type, attributes)
|
6
|
-
@declation_type = declation_type
|
7
|
-
@attributes = attributes
|
8
|
-
end
|
9
|
-
|
10
|
-
def to_s
|
11
|
-
code_snippets.join(' ')
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def code_snippets
|
17
|
-
[
|
18
|
-
random_or_direction_or_parameter_type,
|
19
|
-
data_type,
|
20
|
-
width,
|
21
|
-
identifier,
|
22
|
-
default_value_assignment
|
23
|
-
].select(&:itself)
|
24
|
-
end
|
25
|
-
|
26
|
-
def random_or_direction_or_parameter_type
|
27
|
-
{
|
28
|
-
variable: @attributes[:random] && :rand,
|
29
|
-
port: @attributes[:direction],
|
30
|
-
parameter: @attributes[:parameter_type]
|
31
|
-
}[@declation_type]
|
32
|
-
end
|
33
|
-
|
34
|
-
def data_type
|
35
|
-
@attributes[:data_type]
|
36
|
-
end
|
37
|
-
|
38
|
-
def width
|
39
|
-
return unless vector?
|
40
|
-
"[#{(@attributes[:width] || 1) - 1}:0]"
|
41
|
-
end
|
42
|
-
|
43
|
-
def identifier
|
44
|
-
"#{@attributes[:name]}#{dimensions}"
|
45
|
-
end
|
46
|
-
|
47
|
-
def dimensions
|
48
|
-
return if @attributes[:dimensions].nil?
|
49
|
-
@attributes[:dimensions].map { |dimension| "[#{dimension}]" }.join
|
50
|
-
end
|
51
|
-
|
52
|
-
def default_value_assignment
|
53
|
-
return if @attributes[:default].nil?
|
54
|
-
"= #{@attributes[:default]}"
|
55
|
-
end
|
56
|
-
|
57
|
-
def parameter?
|
58
|
-
@declation_type == :parameter
|
59
|
-
end
|
60
|
-
|
61
|
-
def vector?
|
62
|
-
return true if @attributes[:vector]
|
63
|
-
@attributes[:width] && (parameter? || (@attributes[:width] > 1))
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module RgGen
|
2
|
-
module OutputBase
|
3
|
-
module VerilogUtility
|
4
|
-
class Identifier
|
5
|
-
def initialize(name)
|
6
|
-
@name = name
|
7
|
-
end
|
8
|
-
|
9
|
-
def to_s
|
10
|
-
@name.to_s
|
11
|
-
end
|
12
|
-
|
13
|
-
def [](indexes_or_msb, lsb = indexes_or_msb)
|
14
|
-
if indexes_or_msb.nil?
|
15
|
-
self
|
16
|
-
elsif indexes_or_msb.is_a?(Array)
|
17
|
-
indexes_or_msb.inject(self) do |identifer, index|
|
18
|
-
identifer[index]
|
19
|
-
end
|
20
|
-
elsif indexes_or_msb == lsb
|
21
|
-
Identifier.new("#{@name}[#{indexes_or_msb}]")
|
22
|
-
else
|
23
|
-
Identifier.new("#{@name}[#{indexes_or_msb}:#{lsb}]")
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
module RgGen
|
2
|
-
module OutputBase
|
3
|
-
module VerilogUtility
|
4
|
-
class ModuleDefinition < StructureDefinition
|
5
|
-
attr_setter :parameters
|
6
|
-
attr_setter :ports
|
7
|
-
attr_setter :signals
|
8
|
-
|
9
|
-
def to_code
|
10
|
-
bodies.unshift(signal_declarations) if signals?
|
11
|
-
super
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def header_code
|
17
|
-
code_block do |code|
|
18
|
-
code << :module << space << @name << space
|
19
|
-
parameter_declarations(code)
|
20
|
-
port_declarations(code)
|
21
|
-
code << semicolon
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def footer_code
|
26
|
-
:endmodule
|
27
|
-
end
|
28
|
-
|
29
|
-
def parameters?
|
30
|
-
!(@parameters.nil? || @parameters.empty?)
|
31
|
-
end
|
32
|
-
|
33
|
-
def ports?
|
34
|
-
!(@ports.nil? || @ports.empty?)
|
35
|
-
end
|
36
|
-
|
37
|
-
def signals?
|
38
|
-
!(@signals.nil? || @signals.empty?)
|
39
|
-
end
|
40
|
-
|
41
|
-
def parameter_declarations(code)
|
42
|
-
return unless parameters?
|
43
|
-
wrap(code, '#(', ')') do
|
44
|
-
declarations(@parameters, code)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def port_declarations(code)
|
49
|
-
wrap(code, '(', ')') do
|
50
|
-
declarations(@ports, code) if ports?
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def signal_declarations
|
55
|
-
lambda do |code|
|
56
|
-
signals.each do |signal|
|
57
|
-
code << signal << semicolon << nl
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def declarations(list, code)
|
63
|
-
indent(code, 2) do
|
64
|
-
list.each_with_index do |d, i|
|
65
|
-
code << comma << nl if i > 0
|
66
|
-
code << d
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
module RgGen
|
2
|
-
module OutputBase
|
3
|
-
module VerilogUtility
|
4
|
-
class PackageDefinition < StructureDefinition
|
5
|
-
ImportedPackage = Struct.new(:name, :items) do
|
6
|
-
def to_s
|
7
|
-
"import #{import_items.join(', ')};"
|
8
|
-
end
|
9
|
-
|
10
|
-
def import_items
|
11
|
-
(((items.nil? || items.empty?) && [:*]) || items).map do |item|
|
12
|
-
"#{name}::#{item}"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def import_package(name, items = nil)
|
18
|
-
import_packages << ImportedPackage.new(name, items)
|
19
|
-
end
|
20
|
-
|
21
|
-
def include_file(name)
|
22
|
-
include_files << "`include #{name.to_s.quote}"
|
23
|
-
end
|
24
|
-
|
25
|
-
def to_code
|
26
|
-
bodies.unshift(include_fiels_code ) unless @include_files.nil?
|
27
|
-
bodies.unshift(import_packges_code) unless @import_packages.nil?
|
28
|
-
super
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def header_code
|
34
|
-
"package #{@name};"
|
35
|
-
end
|
36
|
-
|
37
|
-
def footer_code
|
38
|
-
:endpackage
|
39
|
-
end
|
40
|
-
|
41
|
-
def import_packages
|
42
|
-
@import_packages ||= []
|
43
|
-
end
|
44
|
-
|
45
|
-
def include_files
|
46
|
-
@include_files ||= []
|
47
|
-
end
|
48
|
-
|
49
|
-
def import_packges_code
|
50
|
-
lambda do |code|
|
51
|
-
import_packages.each do |package|
|
52
|
-
code << package << nl
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def include_fiels_code
|
58
|
-
lambda do |code|
|
59
|
-
include_files.each do |file|
|
60
|
-
code << file << nl
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|