rggen 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d33b1f653bd2968858ddf63a333f4f14b6886556
4
- data.tar.gz: ef5da01aa0b3ec7a1c5097e1ffdcf14e1c1848ab
3
+ metadata.gz: 19195a9804097d391d2ee4c629922ef49a1d1d82
4
+ data.tar.gz: 7052fa9b494b2948f452649797f5280bef883af2
5
5
  SHA512:
6
- metadata.gz: 16848790ca403c61edc82245bc55b4d6c3edd6ff2638bb08305d5c8df4789d4bf5c71fd9ed06e469023be7fb6d107ed66c53f8348c41ec13ed67328c51d91efd
7
- data.tar.gz: 6b89fa0fe23b35b41052335784b0b9de65d1b4d890e3b906707c84ce35ff2b227496613b611de011de991ef7a834946d35f96bef13f1517ac3af302026e00a4a
6
+ metadata.gz: 59827fbc8e93f033570dd65f7bfaaeb0123c977bc095d0b7d835c80b2f21f263058b880408fc840ed8a7a1da77e05da4e40884462526ade82824336d3ede4014
7
+ data.tar.gz: f31b881ee297b1915fbfe6b60266b8eed027f73d7eb2f0161fe3fb15bddc2a5df4c64304051b2964d3dee59664abe3a0c52e158f2078014f5e498b9cae197a0d
data/README.md CHANGED
@@ -8,8 +8,8 @@
8
8
 
9
9
  # RgGen
10
10
 
11
- RgGen is a code generation tool for SoC designers.
12
- 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.
11
+ RgGen is a code generator tool for SoC/IP/FPGA/RTL engineers.
12
+ It will automatically generate source code for control/status registers, e.g. RTL, UVM RAL model, C header file, from its register map document.
13
13
  Also RgGen is customizable so you can build your specific generate tool.
14
14
 
15
15
  ## Ruby
@@ -2,7 +2,16 @@ module RgGen
2
2
  module RegisterMap
3
3
  class GenericMap
4
4
  class Cell
5
- Position = Struct.new(:file, :sheet, :row, :column)
5
+ Position = Struct.new(:file, :sheet, :row, :column) do
6
+ def to_s
7
+ [
8
+ "file: #{file}",
9
+ "sheet: #{sheet}",
10
+ "row: #{row}",
11
+ "column: #{column}"
12
+ ].join(' ')
13
+ end
14
+ end
6
15
 
7
16
  def initialize(file, sheet, row, column)
8
17
  @position = Position.new(file, sheet, row, column)
@@ -10,6 +10,7 @@ require 'facets/kernel/not_nil'
10
10
  require 'facets/method/curry' unless Method.public_method_defined?(:curry)
11
11
  require 'facets/module/attr_class_accessor'
12
12
  require 'facets/module/attr_setter'
13
+ require 'facets/module/lastname'
13
14
  require 'facets/numeric/positive'
14
15
  require 'facets/object/itself' unless Object.public_method_defined?(:itself)
15
16
  require 'facets/pathname/to_path'
@@ -5,18 +5,24 @@ module RgGen
5
5
  class BuilderError < RgGenError
6
6
  end
7
7
 
8
- class LoadError < RgGenError
8
+ class RuntimeError < RgGenError
9
9
  end
10
10
 
11
- class ConfigurationError < RgGenError
11
+ class LoadError < RgGen::RuntimeError
12
12
  end
13
13
 
14
- class RegisterMapError < RgGenError
15
- def initialize(message, position)
14
+ class ConfigurationError < RgGen::RuntimeError
15
+ end
16
+
17
+ class RegisterMapError < RgGen::RuntimeError
18
+ def initialize(message, position = nil)
16
19
  super(message)
17
20
  @position = position
18
21
  end
19
22
 
20
- attr_reader :position
23
+ def to_s
24
+ return super.to_s unless @position
25
+ "#{super.to_s} -- #{@position}"
26
+ end
21
27
  end
22
28
  end
@@ -140,9 +140,11 @@ module RgGen
140
140
  parse_options(argv, context)
141
141
  load_setup(context)
142
142
  load_configuration(context)
143
- load_register_map(context, argv.first)
143
+ load_register_map(context, argv)
144
144
  write_files(context)
145
145
  end
146
+ rescue RgGen::RuntimeError, OptionParser::ParseError => e
147
+ abort "[#{e.class.lastname}] #{e.message}"
146
148
  end
147
149
 
148
150
  private
@@ -167,7 +169,12 @@ module RgGen
167
169
  end
168
170
 
169
171
  def load_setup(context)
170
- load(context.options[:setup])
172
+ context.options[:setup].tap do |setup|
173
+ File.exist?(setup) || (
174
+ raise RgGen::LoadError, "cannot load such file -- #{setup}"
175
+ )
176
+ load(setup)
177
+ end
171
178
  end
172
179
 
173
180
  def build_factory(component_name)
@@ -179,9 +186,10 @@ module RgGen
179
186
  build_factory(:configuration).create(context.options[:configuration])
180
187
  end
181
188
 
182
- def load_register_map(context, file)
189
+ def load_register_map(context, argv)
190
+ raise RgGen::LoadError, 'no register map is specified' if argv.empty?
183
191
  context.register_map =
184
- build_factory(:register_map).create(context.configuration, file)
192
+ build_factory(:register_map).create(context.configuration, argv.first)
185
193
  end
186
194
 
187
195
  def write_files(context)
@@ -45,13 +45,13 @@ module RgGen
45
45
  end
46
46
 
47
47
  def load_file(file)
48
- find_loader(file).load_file(file)
48
+ find_loader(file).load(file)
49
49
  end
50
50
 
51
51
  def find_loader(file)
52
- loader = @loaders && @loaders.find { |l| l.acceptable?(file) }
53
- return loader.new unless loader.nil?
54
- fail RgGen::LoadError, "unsupported file type: #{File.ext(file)}"
52
+ @loaders.find { |l| l.acceptable?(file) } || (
53
+ raise RgGen::LoadError, "unsupported file type -- #{file}"
54
+ )
55
55
  end
56
56
  end
57
57
  end
@@ -4,10 +4,19 @@ module RgGen
4
4
  class << self
5
5
  attr_writer :supported_types
6
6
 
7
- def acceptable?(file_name)
8
- ext = File.ext(file_name).to_sym
7
+ def acceptable?(file)
8
+ ext = File.ext(file).to_sym
9
9
  @supported_types.any? { |type| type.casecmp(ext) == 0 }
10
10
  end
11
+
12
+ def load(file)
13
+ new.load(file)
14
+ end
15
+ end
16
+
17
+ def load(file)
18
+ return load_file(file) if File.exist?(file)
19
+ raise RgGen::LoadError, "cannot load such file -- #{file}"
11
20
  end
12
21
  end
13
22
  end
@@ -1,6 +1,6 @@
1
1
  module RgGen
2
2
  MAJOR = 0
3
3
  MINOR = 6
4
- TEENY = 1
4
+ TEENY = 2
5
5
  VERSION = "#{MAJOR}.#{MINOR}.#{TEENY}".freeze
6
6
  end
@@ -9,29 +9,16 @@ module rggen_bus_splitter #(
9
9
  );
10
10
  import rggen_rtl_pkg::*;
11
11
 
12
- localparam INDEX_WIDTH = $clog2(TOTAL_REGISTERS+1);
12
+ localparam int STATUS_WIDTH = $bits(rggen_status);
13
13
 
14
- typedef struct packed {
15
- logic [DATA_WIDTH-1:0] read_data;
16
- rggen_status status;
17
- } s_response;
18
-
19
- logic [TOTAL_REGISTERS:0] select;
20
- logic [TOTAL_REGISTERS:0] ready;
21
- s_response response[TOTAL_REGISTERS+1];
14
+ logic [TOTAL_REGISTERS-1:0] select;
15
+ logic [TOTAL_REGISTERS-1:0] ready;
22
16
  logic response_ready;
23
- logic no_register_selected;
17
+ logic register_selected;
24
18
  logic done;
25
- logic read_done;
26
- logic write_done;
27
- s_response selected_response;
28
- genvar g_i;
29
-
30
- assign bus_if.done = done;
31
- assign bus_if.read_done = read_done;
32
- assign bus_if.write_done = write_done;
33
- assign bus_if.read_data = selected_response.read_data;
34
- assign bus_if.status = selected_response.status;
19
+ logic [DATA_WIDTH-1:0] selected_read_data;
20
+ rggen_status selected_status;
21
+ genvar g_i, g_j;
35
22
 
36
23
  generate for (g_i = 0;g_i < TOTAL_REGISTERS;++g_i) begin : g
37
24
  assign register_if[g_i].request = bus_if.request;
@@ -41,47 +28,59 @@ module rggen_bus_splitter #(
41
28
  assign register_if[g_i].write_strobe = bus_if.write_strobe;
42
29
  assign select[g_i] = register_if[g_i].select;
43
30
  assign ready[g_i] = register_if[g_i].ready;
44
- assign response[g_i].read_data = register_if[g_i].read_data;
45
- assign response[g_i].status = register_if[g_i].status;
46
31
  end endgenerate
47
32
 
48
- // dummy response
49
- assign no_register_selected = ~|select[TOTAL_REGISTERS-1:0];
50
- assign select[TOTAL_REGISTERS] = no_register_selected;
51
- assign ready[TOTAL_REGISTERS] = no_register_selected;
52
- assign response[TOTAL_REGISTERS] = '{read_data: '0, status: RGGEN_SLAVE_ERROR};
53
-
54
- assign response_ready = |ready;
33
+ assign bus_if.done = done;
34
+ assign response_ready = |ready;
35
+ assign register_selected = |select;
55
36
  always_ff @(posedge clk, negedge rst_n) begin
56
37
  if (!rst_n) begin
57
38
  done <= '0;
58
- read_done <= '0;
59
- write_done <= '0;
60
- selected_response <= '{read_data: '0, status: RGGEN_OKAY};
39
+ bus_if.read_done <= '0;
40
+ bus_if.write_done <= '0;
41
+ bus_if.read_data <= '0;
42
+ bus_if.status <= RGGEN_OKAY;
61
43
  end
62
- else if (bus_if.request && response_ready && (!done)) begin
44
+ else if (bus_if.request && (response_ready || (!register_selected)) && (!done)) begin
63
45
  done <= '1;
64
- write_done <= (bus_if.direction == RGGEN_WRITE) ? '1 : '0;
65
- read_done <= (bus_if.direction == RGGEN_READ ) ? '1 : '0;
66
- selected_response <= response[calc_index()];
46
+ bus_if.read_done <= (bus_if.direction == RGGEN_READ ) ? '1 : '0;
47
+ bus_if.write_done <= (bus_if.direction == RGGEN_WRITE) ? '1 : '0;
48
+ if (register_selected) begin
49
+ bus_if.read_data <= selected_read_data;
50
+ bus_if.status <= selected_status;
51
+ end
52
+ else begin
53
+ bus_if.read_data <= '0;
54
+ bus_if.status <= RGGEN_SLAVE_ERROR;
55
+ end
67
56
  end
68
57
  else begin
69
58
  done <= '0;
70
- read_done <= '0;
71
- write_done <= '0;
72
- selected_response <= '{read_data: '0, status: RGGEN_OKAY};
59
+ bus_if.read_done <= '0;
60
+ bus_if.write_done <= '0;
61
+ bus_if.read_data <= '0;
62
+ bus_if.status <= RGGEN_OKAY;
73
63
  end
74
64
  end
75
65
 
76
- function automatic logic [INDEX_WIDTH-1:0] calc_index();
77
- logic [INDEX_WIDTH-1:0] index;
78
- for (int i = 0;i < INDEX_WIDTH;++i) begin
79
- logic [TOTAL_REGISTERS:0] temp;
80
- for (int j = 0;j <= TOTAL_REGISTERS;++j) begin
81
- temp[j] = j[i] & select[j];
66
+ // Response Selection
67
+ generate if (1) begin : read_data_selection
68
+ for (g_i = 0;g_i < DATA_WIDTH;++g_i) begin : g
69
+ logic [TOTAL_REGISTERS-1:0] temp;
70
+ assign selected_read_data[g_i] = |temp;
71
+ for (g_j = 0;g_j < TOTAL_REGISTERS;++g_j) begin : g
72
+ assign temp[g_j] = register_if[g_j].read_data[g_i] & register_if[g_j].select;
73
+ end
74
+ end
75
+ end endgenerate
76
+
77
+ generate if (1) begin : status_selection
78
+ for (g_i = 0;g_i < STATUS_WIDTH;++g_i) begin : g
79
+ logic [TOTAL_REGISTERS-1:0] temp;
80
+ assign selected_status[g_i] = |temp;
81
+ for (g_j = 0;g_j < TOTAL_REGISTERS;++g_j) begin : g
82
+ assign temp[g_j] = register_if[g_j].status[g_i] & register_if[g_j].select;
82
83
  end
83
- index[i] = |temp;
84
84
  end
85
- return index;
86
- endfunction
85
+ end endgenerate
87
86
  endmodule
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.1
4
+ version: 0.6.2
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-05-31 00:00:00.000000000 Z
11
+ date: 2017-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: baby_erubis