rggen 0.6.2 → 0.6.3

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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rggen.rb +2 -0
  3. data/lib/rggen/base/item.rb +2 -2
  4. data/lib/rggen/base/item_factory.rb +4 -5
  5. data/lib/rggen/builder/builder.rb +2 -2
  6. data/lib/rggen/builder/item_store.rb +3 -3
  7. data/lib/rggen/builder/list_item_entry.rb +2 -2
  8. data/lib/rggen/builtins/bit_field/type.rb +1 -1
  9. data/lib/rggen/builtins/loaders/register_map/csv_loader.rb +1 -1
  10. data/lib/rggen/builtins/register/offset_address.rb +1 -1
  11. data/lib/rggen/builtins/register/rtl_top.rb +1 -1
  12. data/lib/rggen/builtins/register/type.rb +2 -2
  13. data/lib/rggen/builtins/register/types/indirect.rb +4 -6
  14. data/lib/rggen/builtins/register_block/host_if.rb +1 -1
  15. data/lib/rggen/builtins/register_block/irq_controller.rb +7 -8
  16. data/lib/rggen/core_components/c_utility/data_structure_definition.rb +3 -5
  17. data/lib/rggen/core_components/code_utility.rb +6 -6
  18. data/lib/rggen/core_components/code_utility/code_block.rb +1 -1
  19. data/lib/rggen/core_components/code_utility/source_file.rb +4 -4
  20. data/lib/rggen/core_components/configuration/configuration_factory.rb +1 -1
  21. data/lib/rggen/core_components/configuration/raise_error.rb +1 -1
  22. data/lib/rggen/core_components/register_map/loader.rb +2 -4
  23. data/lib/rggen/core_components/register_map/raise_error.rb +1 -1
  24. data/lib/rggen/core_components/register_map/register_map_factory.rb +3 -6
  25. data/lib/rggen/core_components/verilog_utility/structure_definition.rb +3 -3
  26. data/lib/rggen/generator.rb +5 -154
  27. data/lib/rggen/input_base/loader.rb +1 -1
  28. data/lib/rggen/option_switches.rb +60 -0
  29. data/lib/rggen/options.rb +97 -0
  30. data/lib/rggen/output_base/component.rb +11 -9
  31. data/lib/rggen/version.rb +1 -1
  32. metadata +6 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 19195a9804097d391d2ee4c629922ef49a1d1d82
4
- data.tar.gz: 7052fa9b494b2948f452649797f5280bef883af2
3
+ metadata.gz: 5cf6420ad53a229357bd8445db927fe2c8c23d32
4
+ data.tar.gz: 960ab1258d4dc08dc4f79679b7095f5d7a93dd9b
5
5
  SHA512:
6
- metadata.gz: 59827fbc8e93f033570dd65f7bfaaeb0123c977bc095d0b7d835c80b2f21f263058b880408fc840ed8a7a1da77e05da4e40884462526ade82824336d3ede4014
7
- data.tar.gz: f31b881ee297b1915fbfe6b60266b8eed027f73d7eb2f0161fe3fb15bddc2a5df4c64304051b2964d3dee59664abe3a0c52e158f2078014f5e498b9cae197a0d
6
+ metadata.gz: 3732f7f3ee3826b0594a03b9595172898229a26c0165a3f49a8777582a1fa7f8075a903a0d6ac6f76d89e81bbfca823e9a9e9f128f2ef964bcc0d03334367aa6
7
+ data.tar.gz: b716700cfe79c466b05edf9f47b56ca6706089e09b613d24f8c29cd03d49b20aa1434c0a93e02982c48d902f6ae9e9562b5663b938ca4b69ef197bd05567b9c9
@@ -49,6 +49,8 @@ module RgGen
49
49
  require_relative 'rggen/builder/category'
50
50
  require_relative 'rggen/builder/builder'
51
51
 
52
+ require_relative 'rggen/options'
53
+ require_relative 'rggen/option_switches'
52
54
  require_relative 'rggen/generator'
53
55
 
54
56
  require_relative 'rggen/commands'
@@ -13,10 +13,10 @@ module RgGen
13
13
  define_method(:available?, &body)
14
14
  end
15
15
 
16
- def inherit_class_instance_variable(variable_name, klass, &block)
16
+ def inherit_class_instance_variable(variable_name, klass)
17
17
  return unless klass.instance_variable_defined?(variable_name)
18
18
  v = klass.instance_variable_get(variable_name)
19
- v = block.call(v) if block_given?
19
+ v = yield(v) if block_given?
20
20
  instance_variable_set(variable_name, v)
21
21
  end
22
22
  end
@@ -8,12 +8,11 @@ module RgGen
8
8
 
9
9
  private
10
10
 
11
- def create_item(owner, *args, &block)
11
+ def create_item(owner, *args)
12
12
  item = create_item_object(owner, *args)
13
- if item.available?
14
- block.call(item) if block_given?
15
- owner.add_item(item)
16
- end
13
+ return unless item.available?
14
+ yield item if block_given?
15
+ owner.add_item(item)
17
16
  end
18
17
 
19
18
  def create_item_object(owner, *args)
@@ -10,10 +10,10 @@ module RgGen
10
10
 
11
11
  def initialize
12
12
  @stores = Hash.new do |_, component_name|
13
- fail RgGen::BuilderError, "unknown component: #{component_name}"
13
+ raise RgGen::BuilderError, "unknown component: #{component_name}"
14
14
  end
15
15
  @categories = Hash.new do |_, category_name|
16
- fail RgGen::BuilderError, "unknown category: #{category_name}"
16
+ raise RgGen::BuilderError, "unknown category: #{category_name}"
17
17
  end
18
18
  INITIAL_CATEGORIES.each do |category_name|
19
19
  @categories[category_name] = Category.new
@@ -32,7 +32,7 @@ module RgGen
32
32
  enable_list_item(args[0], args[1])
33
33
  else
34
34
  message = "wrong number of arguments (#{args.size} for 1..2)"
35
- fail ArgumentError, message
35
+ raise ArgumentError, message
36
36
  end
37
37
  end
38
38
 
@@ -65,7 +65,7 @@ module RgGen
65
65
  def define_list_item_class(list_name, item_name, context, body)
66
66
  unless @list_item_entries.key?(list_name)
67
67
  message = "undefined list item entry: #{list_name}"
68
- fail RgGen::BuilderError, message
68
+ raise RgGen::BuilderError, message
69
69
  end
70
70
  entry = @list_item_entries[list_name]
71
71
  entry.define_list_item(item_name, context, &body)
@@ -76,7 +76,7 @@ module RgGen
76
76
  next if @enabled_entries.include?(entry_name)
77
77
  next unless @simple_item_entries.key?(entry_name) ||
78
78
  @list_item_entries.key?(entry_name)
79
- @enabled_entries << entry_name
79
+ @enabled_entries << entry_name
80
80
  end
81
81
  end
82
82
 
@@ -36,7 +36,7 @@ module RgGen
36
36
  klass = Class.new(item_base)
37
37
  unless context.nil?
38
38
  if item_base.private_method_defined?(:shared_context)
39
- fail BuilderError, 'base class already has #shared_context'
39
+ raise BuilderError, 'base class already has #shared_context'
40
40
  end
41
41
  set_context(klass, context)
42
42
  end
@@ -48,7 +48,7 @@ module RgGen
48
48
  Array(item_or_items).each do |item|
49
49
  next unless @items.key?(item)
50
50
  next if @enabled_items.include?(item)
51
- @enabled_items << item
51
+ @enabled_items << item
52
52
  end
53
53
  end
54
54
 
@@ -158,7 +158,7 @@ list_item :bit_field, :type do
158
158
 
159
159
  def convert(cell)
160
160
  @target_items.keys.find(proc { cell }) do |type|
161
- type.to_sym.casecmp(cell.to_sym) == 0
161
+ type.to_sym.casecmp(cell.to_sym).zero?
162
162
  end
163
163
  end
164
164
  end
@@ -9,6 +9,6 @@ loader :register_map, [:csv, :tsv] do
9
9
  end
10
10
 
11
11
  def separator(file)
12
- (File.ext(file) == 'csv') ? ',' : "\t"
12
+ { 'csv' => ',', 'tsv' => "\t" }[File.ext(file).downcase]
13
13
  end
14
14
  end
@@ -36,7 +36,7 @@ simple_item :register, :offset_address do
36
36
 
37
37
  def check_start_end_adderss_relation(cell)
38
38
  return if start_address < end_address
39
- return if [configuration.byte_width, byte_size].all? { |v| v == 1}
39
+ return if [configuration.byte_width, byte_size].all? { |v| v == 1 }
40
40
  error "start address is equal to or greater than end address: #{cell}"
41
41
  end
42
42
 
@@ -27,7 +27,7 @@ simple_item :register, :rtl_top do
27
27
 
28
28
  def loop_variables
29
29
  return nil unless array?
30
- dimensions.size.times.map(&method(:loop_variable))
30
+ Array.new(dimensions.size, &method(:loop_variable))
31
31
  end
32
32
 
33
33
  def loop_variable(level)
@@ -142,7 +142,7 @@ list_item :register, :type do
142
142
  factory do
143
143
  define_struct :cell_value, [:type, :options] do
144
144
  def empty?
145
- self.type.nil?
145
+ type.nil?
146
146
  end
147
147
  end
148
148
 
@@ -229,7 +229,7 @@ list_item :register, :type do
229
229
 
230
230
  def valid_bits_value
231
231
  actual_bit_fields.inject(0) do |bits, bit_field|
232
- bits |= (((1 << bit_field.width) - 1) << bit_field.lsb)
232
+ bits | (((1 << bit_field.width) - 1) << bit_field.lsb)
233
233
  end
234
234
  end
235
235
  end
@@ -55,9 +55,7 @@ list_item :register, :type, :indirect do
55
55
  :check_using_non_existing_index,
56
56
  :check_using_own_bit_field_for_index,
57
57
  :check_using_arrayed_bit_field_for_index
58
- ].each do |checker|
59
- send(checker, entry)
60
- end
58
+ ].each { |checker| send(checker, entry) }
61
59
  end
62
60
 
63
61
  def check_using_same_index_more_than_once(entry)
@@ -82,7 +80,7 @@ list_item :register, :type, :indirect do
82
80
 
83
81
  def check_number_of_array_indexes
84
82
  return if array_indexes.size == size_of_dimensions
85
- error "not match size of array dimensions and number of array indexes"
83
+ error 'not match size of array dimensions and number of array indexes'
86
84
  end
87
85
 
88
86
  def check_array_index_values
@@ -94,7 +92,7 @@ list_item :register, :type, :indirect do
94
92
  end
95
93
 
96
94
  def check_fixed_value_index_values
97
- fixed_value_indexes.each_with_index do |entry, i|
95
+ fixed_value_indexes.each do |entry|
98
96
  next if entry.value <= max_value(entry.name)
99
97
  error "index value(#{entry.value}) is greater thatn " \
100
98
  "maximum value of #{entry.name}(#{max_value(entry.name)})"
@@ -114,7 +112,7 @@ list_item :register, :type, :indirect do
114
112
  end
115
113
 
116
114
  def fixed_value_indexes
117
- indexes.select { |entry| entry.value }
115
+ indexes.select(&:value)
118
116
  end
119
117
 
120
118
  def size_of_dimensions
@@ -30,7 +30,7 @@ list_item :register_block, :host_if do
30
30
 
31
31
  def find_host_if(value, &ifnone)
32
32
  shared_context.enabled_host_ifs.find(ifnone) do |host_if|
33
- host_if.to_sym.casecmp(value.to_sym) == 0
33
+ host_if.to_sym.casecmp(value.to_sym).zero?
34
34
  end
35
35
  end
36
36
  end
@@ -1,6 +1,6 @@
1
1
  simple_item :register_block, :irq_controller do
2
2
  rtl do
3
- available? { total_interrupts > 0 }
3
+ available? { register_block.source.bit_fields.any?(&:irq?) }
4
4
 
5
5
  build do
6
6
  output :register_block, :irq, width: 1 , name: 'o_irq'
@@ -14,11 +14,6 @@ simple_item :register_block, :irq_controller do
14
14
  code << process_template
15
15
  end
16
16
 
17
- def total_interrupts
18
- @total_interrupts ||=
19
- register_block.source.bit_fields.count(&:irq?)
20
- end
21
-
22
17
  def assign_ier
23
18
  assign(ier, concat(ier_fields.map(&:value)))
24
19
  end
@@ -28,11 +23,11 @@ simple_item :register_block, :irq_controller do
28
23
  end
29
24
 
30
25
  def isr_fields
31
- register_block.bit_fields.select(&:irq?)
26
+ @isr_fields ||= register_block.bit_fields.select(&:irq?)
32
27
  end
33
28
 
34
29
  def ier_fields
35
- isr_fields.each_with_object([]) do |isr_field, fields|
30
+ @ier_fields ||= isr_fields.each_with_object([]) do |isr_field, fields|
36
31
  fields << find_ier_field(isr_field.reference)
37
32
  end
38
33
  end
@@ -40,5 +35,9 @@ simple_item :register_block, :irq_controller do
40
35
  def find_ier_field(reference)
41
36
  register_block.bit_fields.find_by(name: reference.name)
42
37
  end
38
+
39
+ def total_interrupts
40
+ @total_interrupts ||= isr_fields.sum(0, &:width)
41
+ end
43
42
  end
44
43
  end
@@ -3,10 +3,10 @@ module RgGen
3
3
  class DataStructureDefinition
4
4
  include CodeUtility
5
5
 
6
- def initialize(type_keyword, type_name, &body)
6
+ def initialize(type_keyword, type_name)
7
7
  @type_keyword = type_keyword
8
8
  @type_name = type_name
9
- body.call(self) if block_given?
9
+ yield(self) if block_given?
10
10
  end
11
11
 
12
12
  attr_setter :members
@@ -34,9 +34,7 @@ module RgGen
34
34
 
35
35
  def body_code(code)
36
36
  indent(code, 2) do
37
- @members.each do |member, i|
38
- code << member << semicolon << nl
39
- end
37
+ @members.each { |member| code << member << semicolon << nl }
40
38
  end
41
39
  end
42
40
 
@@ -28,24 +28,24 @@ module RgGen
28
28
  "\"#{expression}\""
29
29
  end
30
30
 
31
- def code_block(indent_size = 0, &block)
31
+ def code_block(indent_size = 0)
32
32
  CodeBlock.new.tap do |code|
33
33
  code.indent = indent_size
34
- block.call(code) if block_given?
34
+ yield(code) if block_given?
35
35
  end
36
36
  end
37
37
 
38
- def indent(code_block, indent_size, &indent_block)
38
+ def indent(code_block, indent_size)
39
39
  code_block << nl unless code_block.last_line_empty?
40
40
  code_block.indent += indent_size
41
- indent_block.call if block_given?
41
+ yield if block_given?
42
42
  code_block << nl unless code_block.last_line_empty?
43
43
  code_block.indent -= indent_size
44
44
  end
45
45
 
46
- def wrap(code_block, head, tail, &block)
46
+ def wrap(code_block, head, tail)
47
47
  code_block << head
48
- block.call if block_given?
48
+ yield if block_given?
49
49
  code_block << tail
50
50
  end
51
51
 
@@ -47,7 +47,7 @@ module RgGen
47
47
  def merge_code_block(other_block)
48
48
  other_block.lines.each_with_index do |line, i|
49
49
  line.indent += @indent
50
- if i == 0
50
+ if i.zero?
51
51
  @lines.last.indent = line.indent if last_line_empty?
52
52
  @lines.last.words.concat(line.words)
53
53
  else
@@ -10,9 +10,9 @@ module RgGen
10
10
  attr_setter :include_keyword
11
11
  end
12
12
 
13
- def initialize(path, &body)
13
+ def initialize(path)
14
14
  @path = path
15
- body.call(self) if block_given?
15
+ yield(self) if block_given?
16
16
  end
17
17
 
18
18
  attr_reader :path
@@ -62,7 +62,7 @@ module RgGen
62
62
  end
63
63
 
64
64
  def default_guard_macro(prefix, suffix)
65
- "#{prefix}#{path.basename.to_s.upcase.gsub(/\W/, '_')}#{suffix}"
65
+ "#{prefix}#{path.basename.to_s.upcase.gsub(/\W/, '_')}#{suffix}"
66
66
  end
67
67
 
68
68
  def include_guard_header
@@ -73,7 +73,7 @@ module RgGen
73
73
  end
74
74
 
75
75
  def include_guard_footer
76
- @guard_macro && lambda { |c| c << self.class.endif_keyword << nl }
76
+ @guard_macro && ->(c) { c << self.class.endif_keyword << nl }
77
77
  end
78
78
 
79
79
  def include_files_block
@@ -15,7 +15,7 @@ module RgGen
15
15
  data.symbolize_keys!
16
16
  else
17
17
  message = "Hash type required for configuration: #{data.class}"
18
- fail RgGen::LoadError, message
18
+ raise RgGen::LoadError, message
19
19
  end
20
20
  end
21
21
  end
@@ -4,7 +4,7 @@ module RgGen
4
4
  private
5
5
 
6
6
  def error(message = nil)
7
- fail RgGen::ConfigurationError, message
7
+ raise RgGen::ConfigurationError, message
8
8
  end
9
9
  end
10
10
  end
@@ -3,10 +3,8 @@ module RgGen
3
3
  class Loader < InputBase::Loader
4
4
  private
5
5
 
6
- def create_map(file, &block)
7
- map = GenericMap.new(file)
8
- block.call(map) if block_given?
9
- map
6
+ def create_map(file)
7
+ GenericMap.new(file).tap { |m| yield(m) if block_given? }
10
8
  end
11
9
  end
12
10
  end
@@ -10,7 +10,7 @@ module RgGen
10
10
  when GenericMap::Cell then cell_or_position.position
11
11
  else @position
12
12
  end
13
- fail RgGen::RegisterMapError.new(message, error_position)
13
+ raise RgGen::RegisterMapError.new(message, error_position)
14
14
  end
15
15
  end
16
16
  end
@@ -9,12 +9,9 @@ module RgGen
9
9
 
10
10
  def load(file)
11
11
  map = load_file(file)
12
- if map.is_a?(GenericMap)
13
- map
14
- else
15
- message = "GenericMap type required for register map: #{map.class}"
16
- fail RgGen::LoadError, message
17
- end
12
+ return map if map.is_a?(GenericMap)
13
+ message = "GenericMap type required for register map: #{map.class}"
14
+ raise RgGen::LoadError, message
18
15
  end
19
16
  end
20
17
  end
@@ -3,9 +3,9 @@ module RgGen
3
3
  class StructureDefinition
4
4
  include CodeUtility
5
5
 
6
- def initialize(name, &body)
6
+ def initialize(name)
7
7
  @name = name
8
- body.call(self) if block_given?
8
+ yield(self) if block_given?
9
9
  end
10
10
 
11
11
  def body(&block)
@@ -43,7 +43,7 @@ module RgGen
43
43
  end
44
44
 
45
45
  def body_code?
46
- @bodies && @bodies.size > 0
46
+ !(@bodies.nil? || @bodies.empty?)
47
47
  end
48
48
  end
49
49
  end
@@ -1,139 +1,6 @@
1
1
  module RgGen
2
2
  class Generator
3
- Context = Struct.new(:options, :configuration, :register_map) do
4
- def initialize
5
- super
6
- self.options = {}
7
- end
8
- end
9
-
10
- class Option
11
- def initialize(kind)
12
- @kind = kind
13
- end
14
-
15
- attr_accessor :short
16
- attr_accessor :long
17
- attr_accessor :class
18
- attr_writer :default
19
- attr_writer :description
20
- attr_writer :body
21
-
22
- def on(parser, options)
23
- options[@kind] = default_value if default_value
24
- parser.on(*args) do |value|
25
- parser.instance_exec(value, options, @kind, &body)
26
- end
27
- end
28
-
29
- def args
30
- [@short, @long, @class, description].compact
31
- end
32
-
33
- def description
34
- return nil unless @description || default_value
35
- d = ''
36
- d << @description.to_s
37
- d << "(default: #{default_value})" if default_value
38
- d
39
- end
40
-
41
- def body
42
- @body || default_body
43
- end
44
-
45
- def default_body
46
- proc do |value, options, kind|
47
- options[kind] = value
48
- end
49
- end
50
-
51
- def default_value
52
- return unless @default
53
- case @default
54
- when Proc
55
- @default.call
56
- else
57
- @default
58
- end
59
- end
60
- end
61
-
62
- class << self
63
- def options
64
- @options ||= []
65
- end
66
-
67
- private
68
-
69
- def add_option(kind, &body)
70
- options << Option.new(kind)
71
- body.call(options.last)
72
- end
73
- end
74
-
75
- add_option :setup do |option|
76
- option.long = '--setup FILE'
77
- option.default = proc do
78
- ENV['RGGEN_DEFAULT_SETUP_FILE'] ||
79
- File.join(RGGEN_HOME, 'setup', 'default.rb')
80
- end
81
- option.description = 'Specify a setup file to set up RgGen tool'
82
- end
83
-
84
- add_option :configuration do |option|
85
- option.short = '-c'
86
- option.long = '--configuration FILE'
87
- option.default = proc { ENV['RGGEN_DEFAULT_CONFIGURATION_FILE'] }
88
- option.description = 'Specify a configuration file ' \
89
- 'for generated source code'
90
- end
91
-
92
- add_option :output do |option|
93
- option.short = '-o'
94
- option.long = '--output DIR'
95
- option.default = '.'
96
- option.description = 'Specify output directory'
97
- end
98
-
99
- add_option :except do |option|
100
- option.long = '--except [TYPE1,TYPE2,...]'
101
- option.class = Array
102
- option.description = 'Disable the given output file type(s)'
103
- option.body = proc do |value, options, kind|
104
- options[kind] ||= []
105
- options[kind].concat(value.map(&:to_sym))
106
- end
107
- end
108
-
109
- add_option :show_home do |option|
110
- option.long = '--show-home'
111
- option.description = 'Display the path of RgGen tool home directory'
112
- option.body = proc do
113
- puts RGGEN_HOME
114
- exit
115
- end
116
- end
117
-
118
- add_option :version do |option|
119
- option.short = '-v'
120
- option.long = '--version'
121
- option.description = 'Display the version'
122
- option.body = proc do
123
- puts ver
124
- exit
125
- end
126
- end
127
-
128
- add_option :help do |option|
129
- option.short = '-h'
130
- option.long = '--help'
131
- option.description = 'Display this message'
132
- option.body = proc do
133
- puts help
134
- exit
135
- end
136
- end
3
+ Context = Struct.new(:options, :configuration, :register_map)
137
4
 
138
5
  def run(argv)
139
6
  Context.new.tap do |context|
@@ -150,22 +17,7 @@ module RgGen
150
17
  private
151
18
 
152
19
  def parse_options(argv, context)
153
- option_parser(context.options).parse!(argv)
154
- end
155
-
156
- def option_parser(options)
157
- OptionParser.new do |parser|
158
- parser.version = RgGen::VERSION
159
- parser.program_name = 'rggen'
160
- parser.banner = 'Usage: rggen [options] REGISTER_MAP'
161
- add_option_switches(parser, options)
162
- end
163
- end
164
-
165
- def add_option_switches(parser, options)
166
- self.class.options.each do |option|
167
- option.on(parser, options)
168
- end
20
+ context.options = Options.parse(argv)
169
21
  end
170
22
 
171
23
  def load_setup(context)
@@ -195,7 +47,7 @@ module RgGen
195
47
  def write_files(context)
196
48
  file_generators(context).each do |generator|
197
49
  generator.write_file(context.options[:output])
198
- end
50
+ end unless context.options[:load_only]
199
51
  end
200
52
 
201
53
  def file_generators(context)
@@ -207,9 +59,8 @@ module RgGen
207
59
  end
208
60
 
209
61
  def available_output_components(context)
210
- except = context.options[:except]
211
- RgGen.builder.stored_output_components.select do |component|
212
- except.nil? || except.exclude?(component)
62
+ RgGen.builder.stored_output_components.reject do |component|
63
+ context.options[:disable].include?(component)
213
64
  end
214
65
  end
215
66
  end
@@ -6,7 +6,7 @@ module RgGen
6
6
 
7
7
  def acceptable?(file)
8
8
  ext = File.ext(file).to_sym
9
- @supported_types.any? { |type| type.casecmp(ext) == 0 }
9
+ @supported_types.any? { |type| type.casecmp(ext).zero? }
10
10
  end
11
11
 
12
12
  def load(file)
@@ -0,0 +1,60 @@
1
+ module RgGen
2
+ Options.add_option_switch :setup do
3
+ long '--setup FILE'
4
+ description 'Specify a setup file to set up RgGen tool'
5
+ default { ENV['RGGEN_DEFAULT_SETUP_FILE'] || default_setup }
6
+
7
+ def default_setup
8
+ File.join(RgGen::RGGEN_HOME, 'setup', 'default.rb')
9
+ end
10
+ end
11
+
12
+ Options.add_option_switch :configuration do
13
+ short '-c'
14
+ long '--configuration FILE'
15
+ description 'Specify a configuration file for generated source code'
16
+ default { ENV['RGGEN_DEFAULT_CONFIGURATION_FILE'] }
17
+ end
18
+
19
+ Options.add_option_switch :output do
20
+ short '-o'
21
+ long '--output DIR'
22
+ description 'Specify output directory'
23
+ default '.'
24
+ end
25
+
26
+ Options.add_option_switch :load_only do
27
+ long '--load-only'
28
+ option_class TrueClass
29
+ description 'Load input files only if specified'
30
+ default false
31
+ end
32
+
33
+ Options.add_option_switch :disable do
34
+ long '--disable TYPE1[,TYPE2,...]'
35
+ option_class Array
36
+ description 'Disable the given output file type(s)'
37
+ default { [] }
38
+ body { |v, o, k| o[k].concat(v.map(&:to_sym)) }
39
+ end
40
+
41
+ Options.add_option_switch :show_home do
42
+ long '--show-home'
43
+ description 'Display the path of RgGen tool home directory'
44
+ body { puts RgGen::RGGEN_HOME; exit }
45
+ end
46
+
47
+ Options.add_option_switch :version do
48
+ short '-v'
49
+ long '--version'
50
+ description 'Display the version'
51
+ body { puts ver; exit }
52
+ end
53
+
54
+ Options.add_option_switch :help do
55
+ short '-h'
56
+ long '--help'
57
+ description 'Display this message'
58
+ body { puts help; exit }
59
+ end
60
+ end
@@ -0,0 +1,97 @@
1
+ module RgGen
2
+ class Options
3
+ extend Forwardable
4
+
5
+ class OptionSwitch
6
+ def initialize(kind)
7
+ @kind = kind
8
+ end
9
+
10
+ def on(parser, options)
11
+ parser.on(*args) do |value|
12
+ parser.instance_exec(value, options, @kind, &body)
13
+ end
14
+ end
15
+
16
+ attr_setter :short
17
+ attr_setter :long
18
+ attr_setter :option_class
19
+
20
+ def default(value = nil, &block)
21
+ if block_given?
22
+ @default = block
23
+ elsif value
24
+ @default = proc { value }
25
+ else
26
+ @default && @default.call
27
+ end
28
+ end
29
+
30
+ def description(value = nil)
31
+ if value
32
+ @description = value
33
+ elsif @description || @default
34
+ ''.tap do |d|
35
+ d << @description if @description
36
+ d << "(default: #{default})" if default
37
+ end
38
+ end
39
+ end
40
+
41
+ def body(&block)
42
+ if block_given?
43
+ @body = block
44
+ else
45
+ @body || proc { |v, o, k| o[k] = v }
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def args
52
+ [@short, @long, @option_class, description].compact
53
+ end
54
+ end
55
+
56
+ class << self
57
+ def parse(args)
58
+ new.tap { |options| options.parse(args) }
59
+ end
60
+
61
+ def option_switches
62
+ @option_switches ||= {}
63
+ end
64
+
65
+ def add_option_switch(kind, &block)
66
+ option_switches[kind] = OptionSwitch.new(kind)
67
+ option_switches[kind].instance_exec(&block)
68
+ end
69
+ end
70
+
71
+ def_class_delegator :option_switches
72
+ def_delegator :@options, :[]
73
+
74
+ def initialize
75
+ @options = Hash.new { |h, k| h[k] = option_switches[k].default }
76
+ end
77
+
78
+ def parse(args)
79
+ option_parser.parse!(args)
80
+ end
81
+
82
+ private
83
+
84
+ def option_parser
85
+ OptionParser.new do |parser|
86
+ parser.version = RgGen::VERSION
87
+ parser.program_name = 'rggen'
88
+ parser.banner = 'Usage: rggen [options] REGISTER_MAP'
89
+ define_option_switches(parser)
90
+ end
91
+ end
92
+
93
+ def define_option_switches(parser)
94
+ option_switches.each_value { |switch| switch.on(parser, @options) }
95
+ end
96
+ end
97
+ end
@@ -49,7 +49,7 @@ module RgGen
49
49
 
50
50
  def generate_child_code(kind, mode, code)
51
51
  children.inject(code) do |c, child|
52
- child.generate_code(kind, mode, code)
52
+ child.generate_code(kind, mode, c)
53
53
  end
54
54
  end
55
55
 
@@ -58,14 +58,16 @@ module RgGen
58
58
  end
59
59
 
60
60
  def main_code_generator(mode)
61
- return [
62
- method(:generate_item_code ).curry[:generate_code],
63
- method(:generate_child_code)
64
- ] if mode == :top_down
65
- return [
66
- method(:generate_child_code),
67
- method(:generate_item_code ).curry[:generate_code]
68
- ] if mode == :bottom_up
61
+ {
62
+ top_down: [
63
+ method(:generate_item_code ).curry[:generate_code],
64
+ method(:generate_child_code)
65
+ ],
66
+ bottom_up: [
67
+ method(:generate_child_code),
68
+ method(:generate_item_code ).curry[:generate_code]
69
+ ]
70
+ }[mode]
69
71
  end
70
72
 
71
73
  def post_code_generator
@@ -1,6 +1,6 @@
1
1
  module RgGen
2
2
  MAJOR = 0
3
3
  MINOR = 6
4
- TEENY = 2
4
+ TEENY = 3
5
5
  VERSION = "#{MAJOR}.#{MINOR}.#{TEENY}".freeze
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rggen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taichi Ishitani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-02 00:00:00.000000000 Z
11
+ date: 2017-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: baby_erubis
@@ -109,8 +109,8 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0.35'
111
111
  description: |2
112
- RgGen is a code generation tool for SoC designers.
113
- It will automatically generate source code for control registers in a SoC design, e.g. RTL, UVM RAL model, C header file, from its register map document.
112
+ RgGen is a code generator tool for SoC/IP/FPGA/RTL engineers.
113
+ It will automatically generate source code for control/status registers, e.g. RTL, UVM RAL model, C header file, from its register map document.
114
114
  Also RgGen is customizable so you can build your specific generate tool.
115
115
  email:
116
116
  - taichi730@gmail.com
@@ -266,6 +266,8 @@ files:
266
266
  - lib/rggen/input_base/item_factory.rb
267
267
  - lib/rggen/input_base/loader.rb
268
268
  - lib/rggen/input_base/regexp_patterns.rb
269
+ - lib/rggen/option_switches.rb
270
+ - lib/rggen/options.rb
269
271
  - lib/rggen/output_base/code_generator.rb
270
272
  - lib/rggen/output_base/component.rb
271
273
  - lib/rggen/output_base/component_factory.rb