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,56 @@
|
|
1
|
+
simple_item :register_block, :address_struct do
|
2
|
+
c_header do
|
3
|
+
delegate [:data_width, :byte_width] => :configuration
|
4
|
+
delegate [:registers, :name] => :register_block
|
5
|
+
|
6
|
+
generate_code :c_header_item do
|
7
|
+
struct_definition(stuct_name) do |s|
|
8
|
+
s.with_typedef
|
9
|
+
s.members address_struct_members
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def stuct_name
|
14
|
+
"s_#{name}_address_struct"
|
15
|
+
end
|
16
|
+
|
17
|
+
def address_struct_members
|
18
|
+
address_struct_entries.each_cons(2).with_object([]) do |entries, members|
|
19
|
+
dummy_size = entries[1].start_address - entries[0].end_address - 1
|
20
|
+
members << dummy_member(dummy_size) if dummy_size > 0
|
21
|
+
members << entries[1].address_struct_member
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def dummy_member(size)
|
26
|
+
variable_declaration(
|
27
|
+
data_type: "rggen_uint#{data_width}",
|
28
|
+
name: "__dummy_#{dummy_index}",
|
29
|
+
dimensions: [size / byte_width]
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def dummy_index
|
34
|
+
@dummy_index ||= -1
|
35
|
+
@dummy_index += 1
|
36
|
+
end
|
37
|
+
|
38
|
+
def address_struct_entries
|
39
|
+
[].tap do |entries|
|
40
|
+
entries << dummy_entry
|
41
|
+
entries.concat(non_reserved_registers)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def dummy_entry
|
46
|
+
Object.new.tap do |dummy|
|
47
|
+
dummy.attr_singleton_accessor :end_address
|
48
|
+
dummy.end_address = -1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def non_reserved_registers
|
53
|
+
registers.reject(&:reserved?).sort_by(&:start_address)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
simple_item :register_block, :c_header_file do
|
2
|
+
c_header do
|
3
|
+
delegate [:name] => :register_block
|
4
|
+
|
5
|
+
write_file '<%= name %>.h' do |f|
|
6
|
+
f.include_guard
|
7
|
+
f.include_file 'rggen.h'
|
8
|
+
f.body { |code| source_file_body(code) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def source_file_body(code)
|
12
|
+
register_block.generate_code(:c_header_item, :top_down, code)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -2,7 +2,12 @@ simple_item :register_block, :ral_package do
|
|
2
2
|
ral do
|
3
3
|
delegate :name => :register_block
|
4
4
|
|
5
|
-
write_file '<%= name %>_ral_pkg.sv' do
|
5
|
+
write_file '<%= name %>_ral_pkg.sv' do |f|
|
6
|
+
f.include_guard
|
7
|
+
f.body { source_file_body }
|
8
|
+
end
|
9
|
+
|
10
|
+
def source_file_body
|
6
11
|
package_definition "#{name}_ral_pkg" do |pkg|
|
7
12
|
pkg.import_package :uvm_pkg
|
8
13
|
pkg.import_package :rggen_ral_pkg
|
@@ -25,11 +25,11 @@ simple_item :register_block, :response_mux do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def external_registers?
|
28
|
-
register_block.registers.any?(
|
28
|
+
register_block.registers.any? { |r| r.type?(:external) }
|
29
29
|
end
|
30
30
|
|
31
31
|
def total_external_registers
|
32
|
-
register_block.registers.count(
|
32
|
+
register_block.registers.count { |r| r.type?(:external) }
|
33
33
|
end
|
34
34
|
|
35
35
|
def actual_external_register_select
|
@@ -1,6 +1,10 @@
|
|
1
1
|
define_simple_item :register_block, :top_module do
|
2
2
|
rtl do
|
3
|
-
write_file '<%= register_block.name %>.sv' do
|
3
|
+
write_file '<%= register_block.name %>.sv' do |f|
|
4
|
+
f.body { source_file_body }
|
5
|
+
end
|
6
|
+
|
7
|
+
def source_file_body
|
4
8
|
module_definition register_block.name do |m|
|
5
9
|
m.parameters register_block.parameter_declarations
|
6
10
|
m.ports register_block.port_declarations
|
@@ -1,3 +1,25 @@
|
|
1
|
+
require_relative 'core_components/erb_engine'
|
2
|
+
|
3
|
+
require_relative 'core_components/code_utility/line'
|
4
|
+
require_relative 'core_components/code_utility/code_block'
|
5
|
+
require_relative 'core_components/code_utility/source_file'
|
6
|
+
require_relative 'core_components/code_utility'
|
7
|
+
|
8
|
+
require_relative 'core_components/verilog_utility/identifier'
|
9
|
+
require_relative 'core_components/verilog_utility/declaration'
|
10
|
+
require_relative 'core_components/verilog_utility/structure_definition'
|
11
|
+
require_relative 'core_components/verilog_utility/module_definition'
|
12
|
+
require_relative 'core_components/verilog_utility/package_definition'
|
13
|
+
require_relative 'core_components/verilog_utility/class_definition'
|
14
|
+
require_relative 'core_components/verilog_utility/subroutine_definition'
|
15
|
+
require_relative 'core_components/verilog_utility/source_file'
|
16
|
+
require_relative 'core_components/verilog_utility'
|
17
|
+
|
18
|
+
require_relative 'core_components/c_utility/variable_declaration'
|
19
|
+
require_relative 'core_components/c_utility/data_structure_definition'
|
20
|
+
require_relative 'core_components/c_utility/source_file'
|
21
|
+
require_relative 'core_components/c_utility'
|
22
|
+
|
1
23
|
require_relative 'core_components/configuration/raise_error'
|
2
24
|
require_relative 'core_components/configuration/item'
|
3
25
|
require_relative 'core_components/configuration/configuration_factory'
|
@@ -24,3 +46,6 @@ require_relative 'core_components/rtl/setup'
|
|
24
46
|
require_relative 'core_components/ral/component'
|
25
47
|
require_relative 'core_components/ral/item'
|
26
48
|
require_relative 'core_components/ral/setup'
|
49
|
+
|
50
|
+
require_relative 'core_components/c_header/item'
|
51
|
+
require_relative 'core_components/c_header/setup'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RgGen
|
2
|
+
module CHeader
|
3
|
+
output_component_store :c_header do
|
4
|
+
entry do
|
5
|
+
component_class OutputBase::Component
|
6
|
+
component_factory OutputBase::ComponentFactory
|
7
|
+
end
|
8
|
+
|
9
|
+
entry [:register_block, :register, :bit_field] do
|
10
|
+
component_class OutputBase::Component
|
11
|
+
component_factory OutputBase::ComponentFactory
|
12
|
+
item_base Item
|
13
|
+
item_factory OutputBase::ItemFactory
|
14
|
+
end
|
15
|
+
|
16
|
+
output_directory 'c_header'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RgGen
|
2
|
+
module CUtility
|
3
|
+
include CodeUtility
|
4
|
+
|
5
|
+
def create_blank_file(path)
|
6
|
+
SourceFile.new(path)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def variable_declaration(attributes)
|
12
|
+
VariableDeclaration.new(attributes)
|
13
|
+
end
|
14
|
+
|
15
|
+
def struct_definition(type_name, &body)
|
16
|
+
DataStructureDefinition.new(:struct, type_name, &body).to_code
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module RgGen
|
2
|
+
module CUtility
|
3
|
+
class DataStructureDefinition
|
4
|
+
include CodeUtility
|
5
|
+
|
6
|
+
def initialize(type_keyword, type_name, &body)
|
7
|
+
@type_keyword = type_keyword
|
8
|
+
@type_name = type_name
|
9
|
+
body.call(self) if block_given?
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_setter :members
|
13
|
+
|
14
|
+
def with_typedef(typedef_name = nil)
|
15
|
+
@with_typedef = true
|
16
|
+
@typedef_name = typedef_name
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_code
|
20
|
+
code_block do |code|
|
21
|
+
header_code(code)
|
22
|
+
body_code(code)
|
23
|
+
footer_code(code)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def header_code(code)
|
30
|
+
code << [
|
31
|
+
typedef, @type_keyword, type_name, '{'
|
32
|
+
].compact.join(space) << nl
|
33
|
+
end
|
34
|
+
|
35
|
+
def body_code(code)
|
36
|
+
indent(code, 2) do
|
37
|
+
@members.each do |member, i|
|
38
|
+
code << member << semicolon << nl
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def footer_code(code)
|
44
|
+
code << ['}', typedef_name].compact.join(space) << semicolon << nl
|
45
|
+
end
|
46
|
+
|
47
|
+
def typedef
|
48
|
+
@with_typedef && :typedef
|
49
|
+
end
|
50
|
+
|
51
|
+
def type_name
|
52
|
+
return @type_name unless @with_typedef
|
53
|
+
@typedef_name && @type_name
|
54
|
+
end
|
55
|
+
|
56
|
+
def typedef_name
|
57
|
+
return nil unless @with_typedef
|
58
|
+
@typedef_name || @type_name
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module RgGen
|
2
|
+
module CUtility
|
3
|
+
class VariableDeclaration
|
4
|
+
def initialize(attributes)
|
5
|
+
@attributes = attributes
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_s
|
9
|
+
[
|
10
|
+
data_type, identifier, default_value_assignment
|
11
|
+
].compact.join(' ')
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def data_type
|
17
|
+
@attributes[:data_type]
|
18
|
+
end
|
19
|
+
|
20
|
+
def identifier
|
21
|
+
"#{@attributes[:name]}#{dimensions}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def dimensions
|
25
|
+
return unless @attributes[:dimensions]
|
26
|
+
@attributes[:dimensions].map { |d| "[#{d}]" }.join
|
27
|
+
end
|
28
|
+
|
29
|
+
def default_value_assignment
|
30
|
+
return unless @attributes[:default]
|
31
|
+
"= #{@attributes[:default]}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module RgGen
|
2
|
+
module CodeUtility
|
3
|
+
def create_blank_code
|
4
|
+
CodeBlock.new
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def newline
|
10
|
+
:newline
|
11
|
+
end
|
12
|
+
|
13
|
+
alias_method :nl, :newline
|
14
|
+
|
15
|
+
def comma
|
16
|
+
','
|
17
|
+
end
|
18
|
+
|
19
|
+
def semicolon
|
20
|
+
';'
|
21
|
+
end
|
22
|
+
|
23
|
+
def space(size = 1)
|
24
|
+
' ' * size
|
25
|
+
end
|
26
|
+
|
27
|
+
def string(expression)
|
28
|
+
"\"#{expression}\""
|
29
|
+
end
|
30
|
+
|
31
|
+
def code_block(indent_size = 0, &block)
|
32
|
+
CodeBlock.new.tap do |code|
|
33
|
+
code.indent = indent_size
|
34
|
+
block.call(code) if block_given?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def indent(code_block, indent_size, &indent_block)
|
39
|
+
code_block << nl unless code_block.last_line_empty?
|
40
|
+
code_block.indent += indent_size
|
41
|
+
indent_block.call if block_given?
|
42
|
+
code_block << nl unless code_block.last_line_empty?
|
43
|
+
code_block.indent -= indent_size
|
44
|
+
end
|
45
|
+
|
46
|
+
def wrap(code_block, head, tail, &block)
|
47
|
+
code_block << head
|
48
|
+
block.call if block_given?
|
49
|
+
code_block << tail
|
50
|
+
end
|
51
|
+
|
52
|
+
def loop_index(level)
|
53
|
+
level.times.with_object('i') { |_, index| index.next! }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module RgGen
|
2
|
+
module CodeUtility
|
3
|
+
class SourceFile
|
4
|
+
include CodeUtility
|
5
|
+
|
6
|
+
class << self
|
7
|
+
attr_setter :ifndef_keyword
|
8
|
+
attr_setter :endif_keyword
|
9
|
+
attr_setter :define_keyword
|
10
|
+
attr_setter :include_keyword
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(path, &body)
|
14
|
+
@path = path
|
15
|
+
body.call(self) if block_given?
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :path
|
19
|
+
|
20
|
+
def header(&block)
|
21
|
+
@header_block ||= block
|
22
|
+
end
|
23
|
+
|
24
|
+
def include_guard(prefix = nil, suffix = prefix, &block)
|
25
|
+
@guard_macro ||= (
|
26
|
+
block || method(:default_guard_macro)
|
27
|
+
).call(prefix, suffix)
|
28
|
+
end
|
29
|
+
|
30
|
+
def include_file(file)
|
31
|
+
include_files << file
|
32
|
+
end
|
33
|
+
|
34
|
+
def body(&block)
|
35
|
+
@body_block ||= block
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_code
|
39
|
+
code_block do |c|
|
40
|
+
blocks.each { |b| generate_code(c, b) }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
to_code.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def blocks
|
51
|
+
[
|
52
|
+
@header_block,
|
53
|
+
include_guard_header,
|
54
|
+
include_files_block,
|
55
|
+
@body_block,
|
56
|
+
include_guard_footer
|
57
|
+
].compact
|
58
|
+
end
|
59
|
+
|
60
|
+
def include_files
|
61
|
+
@include_files ||= []
|
62
|
+
end
|
63
|
+
|
64
|
+
def default_guard_macro(prefix, suffix)
|
65
|
+
"#{prefix}#{path.basename.to_s.upcase.gsub(/\W/, '_')}#{suffix}"
|
66
|
+
end
|
67
|
+
|
68
|
+
def include_guard_header
|
69
|
+
@guard_macro && lambda do |c|
|
70
|
+
c << "#{self.class.ifndef_keyword} #{@guard_macro}" << nl
|
71
|
+
c << "#{self.class.define_keyword} #{@guard_macro}" << nl
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def include_guard_footer
|
76
|
+
@guard_macro && lambda { |c| c << self.class.endif_keyword << nl }
|
77
|
+
end
|
78
|
+
|
79
|
+
def include_files_block
|
80
|
+
@include_files && lambda do |c|
|
81
|
+
include_files.each do |f|
|
82
|
+
c << "#{self.class.include_keyword} #{f.to_s.quote}" << nl
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def generate_code(code, block)
|
88
|
+
if block.arity.zero?
|
89
|
+
code << block.call
|
90
|
+
else
|
91
|
+
block.call(code)
|
92
|
+
end
|
93
|
+
code << nl unless code.last_line_empty?
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|