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
@@ -0,0 +1,15 @@
|
|
1
|
+
module RgGen
|
2
|
+
class ERBEngine < OutputBase::TemplateEngine
|
3
|
+
def file_extension
|
4
|
+
:erb
|
5
|
+
end
|
6
|
+
|
7
|
+
def parse_template(path)
|
8
|
+
BabyErubis::Text.new.from_str(File.read(path), path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def render(context, template)
|
12
|
+
template.render(context)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module RgGen
|
2
|
+
module VerilogUtility
|
3
|
+
include CodeUtility
|
4
|
+
|
5
|
+
def create_blank_file(path)
|
6
|
+
SourceFile.new(path)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def create_identifier(name)
|
12
|
+
Identifier.new(name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_declaration(declaration_type, attributes)
|
16
|
+
Declaration.new(declaration_type, attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
def module_definition(name, &body)
|
20
|
+
ModuleDefinition.new(name, &body).to_code
|
21
|
+
end
|
22
|
+
|
23
|
+
def package_definition(name, &body)
|
24
|
+
PackageDefinition.new(name, &body).to_code
|
25
|
+
end
|
26
|
+
|
27
|
+
def class_definition(name, &body)
|
28
|
+
ClassDefinition.new(name, &body).to_code
|
29
|
+
end
|
30
|
+
|
31
|
+
def function_definition(name, &body)
|
32
|
+
SubroutineDefinition.new(:function, name, &body).to_code
|
33
|
+
end
|
34
|
+
|
35
|
+
def argument(name, attributes)
|
36
|
+
attributes[:name] = name
|
37
|
+
create_declaration(:port, attributes)
|
38
|
+
end
|
39
|
+
|
40
|
+
def assign(lhs, rhs)
|
41
|
+
"assign #{lhs} = #{rhs};"
|
42
|
+
end
|
43
|
+
|
44
|
+
def subroutine_call(subroutine, arguments = nil)
|
45
|
+
"#{subroutine}(#{Array(arguments).join(', ')})"
|
46
|
+
end
|
47
|
+
|
48
|
+
def concat(expression_or_expressions)
|
49
|
+
"{#{Array(expression_or_expressions).join(', ')}}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def array(expression_or_expressions)
|
53
|
+
"'#{concat(expression_or_expressions)}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def bin(value, width)
|
57
|
+
format("%d'b%0*b", width, width, value)
|
58
|
+
end
|
59
|
+
|
60
|
+
def dec(value, width)
|
61
|
+
format("%d'd%d", width, value)
|
62
|
+
end
|
63
|
+
|
64
|
+
def hex(value, width)
|
65
|
+
print_width = (width + 3) / 4
|
66
|
+
format("%d'h%0*x", width, print_width, value)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module RgGen
|
2
|
+
module VerilogUtility
|
3
|
+
class ClassDefinition < StructureDefinition
|
4
|
+
attr_setter :base
|
5
|
+
attr_setter :parameters
|
6
|
+
attr_setter :variables
|
7
|
+
|
8
|
+
def to_code
|
9
|
+
bodies.unshift(variables_declarations) if variables?
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def header_code
|
16
|
+
code_block do |code|
|
17
|
+
code << :class << space << @name
|
18
|
+
paraemter_declarations(code) if parameters?
|
19
|
+
code << space <<:extends << space << @base unless @base.nil?
|
20
|
+
code << semicolon
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def footer_code
|
25
|
+
:endclass
|
26
|
+
end
|
27
|
+
|
28
|
+
def parameters?
|
29
|
+
!(@parameters.nil? || @parameters.empty?)
|
30
|
+
end
|
31
|
+
|
32
|
+
def variables?
|
33
|
+
!(@variables.nil? || @variables.empty?)
|
34
|
+
end
|
35
|
+
|
36
|
+
def paraemter_declarations(code)
|
37
|
+
wrap(code, '#(', ')') do
|
38
|
+
indent(code, 2) do
|
39
|
+
@parameters.each_with_index do |d, i|
|
40
|
+
code << comma << nl if i > 0
|
41
|
+
code << d
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def variables_declarations
|
48
|
+
lambda do |code|
|
49
|
+
variables.each do |variable|
|
50
|
+
code << variable << semicolon << nl
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module RgGen
|
2
|
+
module VerilogUtility
|
3
|
+
class Declaration
|
4
|
+
def initialize(declation_type, attributes)
|
5
|
+
@declation_type = declation_type
|
6
|
+
@attributes = attributes
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
code_snippets.join(' ')
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def code_snippets
|
16
|
+
[
|
17
|
+
random_or_direction_or_parameter_type,
|
18
|
+
data_type,
|
19
|
+
width,
|
20
|
+
identifier,
|
21
|
+
default_value_assignment
|
22
|
+
].select(&:itself)
|
23
|
+
end
|
24
|
+
|
25
|
+
def random_or_direction_or_parameter_type
|
26
|
+
{
|
27
|
+
variable: @attributes[:random] && :rand,
|
28
|
+
port: @attributes[:direction],
|
29
|
+
parameter: @attributes[:parameter_type]
|
30
|
+
}[@declation_type]
|
31
|
+
end
|
32
|
+
|
33
|
+
def data_type
|
34
|
+
@attributes[:data_type]
|
35
|
+
end
|
36
|
+
|
37
|
+
def width
|
38
|
+
return unless vector?
|
39
|
+
"[#{(@attributes[:width] || 1) - 1}:0]"
|
40
|
+
end
|
41
|
+
|
42
|
+
def identifier
|
43
|
+
"#{@attributes[:name]}#{dimensions}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def dimensions
|
47
|
+
return if @attributes[:dimensions].nil?
|
48
|
+
@attributes[:dimensions].map { |dimension| "[#{dimension}]" }.join
|
49
|
+
end
|
50
|
+
|
51
|
+
def default_value_assignment
|
52
|
+
return if @attributes[:default].nil?
|
53
|
+
"= #{@attributes[:default]}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def parameter?
|
57
|
+
@declation_type == :parameter
|
58
|
+
end
|
59
|
+
|
60
|
+
def vector?
|
61
|
+
return true if @attributes[:vector]
|
62
|
+
@attributes[:width] && (parameter? || (@attributes[:width] > 1))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RgGen
|
2
|
+
module VerilogUtility
|
3
|
+
class Identifier
|
4
|
+
def initialize(name)
|
5
|
+
@name = name
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_s
|
9
|
+
@name.to_s
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](indexes_or_msb, lsb = indexes_or_msb)
|
13
|
+
if indexes_or_msb.nil?
|
14
|
+
self
|
15
|
+
elsif indexes_or_msb.is_a?(Array)
|
16
|
+
indexes_or_msb.inject(self) do |identifer, index|
|
17
|
+
identifer[index]
|
18
|
+
end
|
19
|
+
elsif indexes_or_msb == lsb
|
20
|
+
Identifier.new("#{@name}[#{indexes_or_msb}]")
|
21
|
+
else
|
22
|
+
Identifier.new("#{@name}[#{indexes_or_msb}:#{lsb}]")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module RgGen
|
2
|
+
module VerilogUtility
|
3
|
+
class ModuleDefinition < StructureDefinition
|
4
|
+
attr_setter :parameters
|
5
|
+
attr_setter :ports
|
6
|
+
attr_setter :signals
|
7
|
+
|
8
|
+
def to_code
|
9
|
+
bodies.unshift(signal_declarations) if signals?
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def header_code
|
16
|
+
code_block do |code|
|
17
|
+
code << :module << space << @name << space
|
18
|
+
parameter_declarations(code)
|
19
|
+
port_declarations(code)
|
20
|
+
code << semicolon
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def footer_code
|
25
|
+
:endmodule
|
26
|
+
end
|
27
|
+
|
28
|
+
def parameters?
|
29
|
+
!(@parameters.nil? || @parameters.empty?)
|
30
|
+
end
|
31
|
+
|
32
|
+
def ports?
|
33
|
+
!(@ports.nil? || @ports.empty?)
|
34
|
+
end
|
35
|
+
|
36
|
+
def signals?
|
37
|
+
!(@signals.nil? || @signals.empty?)
|
38
|
+
end
|
39
|
+
|
40
|
+
def parameter_declarations(code)
|
41
|
+
return unless parameters?
|
42
|
+
wrap(code, '#(', ')') do
|
43
|
+
declarations(@parameters, code)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def port_declarations(code)
|
48
|
+
wrap(code, '(', ')') do
|
49
|
+
declarations(@ports, code) if ports?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def signal_declarations
|
54
|
+
lambda do |code|
|
55
|
+
signals.each do |signal|
|
56
|
+
code << signal << semicolon << nl
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def declarations(list, code)
|
62
|
+
indent(code, 2) do
|
63
|
+
list.each_with_index do |d, i|
|
64
|
+
code << comma << nl if i > 0
|
65
|
+
code << d
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module RgGen
|
2
|
+
module VerilogUtility
|
3
|
+
class PackageDefinition < StructureDefinition
|
4
|
+
ImportedPackage = Struct.new(:name, :items) do
|
5
|
+
def to_s
|
6
|
+
"import #{import_items.join(', ')};"
|
7
|
+
end
|
8
|
+
|
9
|
+
def import_items
|
10
|
+
(((items.nil? || items.empty?) && [:*]) || items).map do |item|
|
11
|
+
"#{name}::#{item}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def import_package(name, items = nil)
|
17
|
+
import_packages << ImportedPackage.new(name, items)
|
18
|
+
end
|
19
|
+
|
20
|
+
def include_file(name)
|
21
|
+
include_files << "`include #{name.to_s.quote}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_code
|
25
|
+
bodies.unshift(include_fiels_code ) unless @include_files.nil?
|
26
|
+
bodies.unshift(import_packges_code) unless @import_packages.nil?
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def header_code
|
33
|
+
"package #{@name};"
|
34
|
+
end
|
35
|
+
|
36
|
+
def footer_code
|
37
|
+
:endpackage
|
38
|
+
end
|
39
|
+
|
40
|
+
def import_packages
|
41
|
+
@import_packages ||= []
|
42
|
+
end
|
43
|
+
|
44
|
+
def include_files
|
45
|
+
@include_files ||= []
|
46
|
+
end
|
47
|
+
|
48
|
+
def import_packges_code
|
49
|
+
lambda do |code|
|
50
|
+
import_packages.each do |package|
|
51
|
+
code << package << nl
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def include_fiels_code
|
57
|
+
lambda do |code|
|
58
|
+
include_files.each do |file|
|
59
|
+
code << file << nl
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module RgGen
|
2
|
+
module VerilogUtility
|
3
|
+
class StructureDefinition
|
4
|
+
include CodeUtility
|
5
|
+
|
6
|
+
def initialize(name, &body)
|
7
|
+
@name = name
|
8
|
+
body.call(self) if block_given?
|
9
|
+
end
|
10
|
+
|
11
|
+
def body(&block)
|
12
|
+
bodies << block if block_given?
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_code
|
16
|
+
code_block do |code|
|
17
|
+
code << header_code << nl
|
18
|
+
body_code(code) if body_code?
|
19
|
+
code << footer_code << nl
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def bodies
|
26
|
+
@bodies ||= []
|
27
|
+
end
|
28
|
+
|
29
|
+
def body_code(code)
|
30
|
+
bodies.each do |body|
|
31
|
+
generate_body_code(code, body)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def generate_body_code(code, body)
|
36
|
+
indent(code, 2) do
|
37
|
+
if body.arity.zero?
|
38
|
+
code << body.call
|
39
|
+
else
|
40
|
+
body.call(code)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def body_code?
|
46
|
+
@bodies && @bodies.size > 0
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|