rggen-c-header 0.1.0 → 0.2.0

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
  SHA256:
3
- metadata.gz: bde50cf30f12147cac1bbe3b5d13ba5a1fadf7714d24f64a3fbe339708eadae4
4
- data.tar.gz: e88709a2d9362c0d326e732a59ad910df61176d61a9acf55e2463e7505f44d3f
3
+ metadata.gz: 4150e4e77b8fee78e7832a812c4332ce5b56f016c1caa803c23dd2ee032fad55
4
+ data.tar.gz: 372b8614c051deee871ab887a24930c02d8d93cc97401aa937541f1d6b5fcde9
5
5
  SHA512:
6
- metadata.gz: ff93ca1e266012860248b3df4a63c3fd1789ba6937761bd077c6bf53b456eded67b0a0fa19529910a36aea4843c44408941a0a4bb97fc6124ea71d5063a1644c
7
- data.tar.gz: 97f87c1eed64dba48287b0645a5f93a0e4b34d3b14921f85fc7737825c86cbb3c7467e8c53fb59e68e21741ff24243cc863a51fc42a5c5f4029510108c45f6cf
6
+ metadata.gz: a01adcc5020ff80a58c547978cff3eadb24edacf9d96c861600fb9d5136f9a70190bf64a71205bea2c4270456e2134c1d3afbe73955a9c3c311459189c843e6d
7
+ data.tar.gz: ba3d13e5ac18902391b2797bfbda75c78846ca0c240c9fc750195beab84875d8f8a03ed300ed63eb5e839c4c4e8a14a357c90968454f3cfd0e63abf55860293a
data/README.md CHANGED
@@ -8,29 +8,18 @@
8
8
 
9
9
  RgGen::CHeader is a RgGen plugin to generate C header file.
10
10
 
11
- ## Installation
11
+ ## Installati
12
12
 
13
- To install RgGen::CHeader, use the following command:
13
+ During RgGen installation, RgGen::CHeader will also be installed autoamtically.
14
14
 
15
15
  ```
16
- $ gem install rggen-c-header
17
- ```
18
-
19
- ## Usage
20
-
21
- You need to tell RgGen to load RgGen::CHeader plugin. There are two ways.
22
-
23
- ### Using `--plugin` runtime option
24
-
25
- ```
26
- $ rggen --plugin rggen-c-header your_register_map.yml
16
+ $ gem install rggen
27
17
  ```
28
18
 
29
- ### Using `RGGEN_PLUGINS` environment variable
19
+ If you want to install RgGen::CHeader only, use the command below.
30
20
 
31
21
  ```
32
- $ export RGGEN_PLUGINS=${RGGEN_PLUGINS}:rggen-c-header
33
- $ rggen your_register_map.yml
22
+ $ gem install rggen-c-header
34
23
  ```
35
24
 
36
25
  ## Example
@@ -5,8 +5,15 @@ module RgGen
5
5
  class Component < Core::OutputBase::Component
6
6
  def macro_definitions
7
7
  [
8
- @features.each_value.map(&:macro_definitions),
9
- @children.map(&:macro_definitions)
8
+ @children.map(&:macro_definitions),
9
+ @features.each_value.map(&:macro_definitions)
10
+ ].flatten
11
+ end
12
+
13
+ def struct_definitions
14
+ [
15
+ @children.map(&:struct_definitions),
16
+ @features.each_value.map(&:struct_definitions)
10
17
  ].flatten
11
18
  end
12
19
  end
@@ -9,6 +9,10 @@ module RgGen
9
9
  @macro_definitions ||= []
10
10
  end
11
11
 
12
+ def struct_definitions
13
+ @struct_definitions ||= []
14
+ end
15
+
12
16
  private
13
17
 
14
18
  def define_macro(name, value = nil)
@@ -16,6 +20,16 @@ module RgGen
16
20
  Utility::MacroDefinition.new(name.upcase, value)
17
21
  end
18
22
 
23
+ def define_struct(name, members)
24
+ struct_definitions <<
25
+ Utility::StructDefinition.new(:struct, name, members)
26
+ end
27
+
28
+ def define_union(name, members)
29
+ struct_definitions <<
30
+ Utility::StructDefinition.new(:union, name, members)
31
+ end
32
+
19
33
  def full_name(separator = '_')
20
34
  [register_block.name, component.full_name(separator)].join(separator)
21
35
  end
@@ -2,15 +2,6 @@
2
2
 
3
3
  RgGen.define_simple_feature(:register, :c_header) do
4
4
  c_header do
5
- pre_build do
6
- if register.width > 64
7
- message =
8
- 'register of which width is wider than 64 bits is not allowed: ' \
9
- "#{full_name('.')} width #{register.width}"
10
- raise RgGen::Core::RegisterMap::RegisterMapError.new(message)
11
- end
12
- end
13
-
14
5
  build do
15
6
  define_macro("#{full_name}_byte_width", byte_width)
16
7
  define_macro("#{full_name}_byte_size", byte_size)
@@ -18,6 +9,13 @@ RgGen.define_simple_feature(:register, :c_header) do
18
9
  define_offset_address_macros
19
10
  end
20
11
 
12
+ export def declaration
13
+ type = "uint#{register.width}_t"
14
+ name = register.name
15
+ size = !shared_address? && register.size || nil
16
+ create_declaration(type, name, size)
17
+ end
18
+
21
19
  private
22
20
 
23
21
  def byte_width
@@ -32,6 +30,10 @@ RgGen.define_simple_feature(:register, :c_header) do
32
30
  register_files.any?(&:array?) || register.array?
33
31
  end
34
32
 
33
+ def shared_address?
34
+ register.settings[:support_shared_address]
35
+ end
36
+
35
37
  def define_array_macros
36
38
  size_list = array_size
37
39
  define_macro("#{full_name}_array_dimension", size_list.size)
@@ -57,7 +59,7 @@ RgGen.define_simple_feature(:register, :c_header) do
57
59
 
58
60
  def local_address_list
59
61
  Array.new(register.count) do |i|
60
- if register.settings[:support_shared_address]
62
+ if shared_address?
61
63
  register.offset_address
62
64
  else
63
65
  register.offset_address + register.byte_width * i
@@ -2,13 +2,42 @@
2
2
 
3
3
  RgGen.define_simple_feature(:register_block, :c_header) do
4
4
  c_header do
5
+ include RgGen::CHeader::StructBuilder
6
+
7
+ pre_build do
8
+ if configuration.enable_wide_register?
9
+ message =
10
+ 'enabling wide register is not allowed ' \
11
+ 'for c header file generation'
12
+ raise RgGen::Core::Configuration::ConfigurationError.new(message)
13
+ end
14
+ end
15
+
16
+ build do
17
+ build_struct
18
+ end
19
+
5
20
  write_file '<%= register_block.name %>.h' do |f|
6
21
  f.include_guard
22
+ f.include_file 'stdint.h'
7
23
  f.body do |code|
8
24
  register_block.macro_definitions.each do |macro|
9
25
  code << macro << nl
10
26
  end
27
+ register_block.struct_definitions.each do |struct|
28
+ code << struct
29
+ end
11
30
  end
12
31
  end
32
+
33
+ private
34
+
35
+ def struct_base_name
36
+ register_block.name
37
+ end
38
+
39
+ def byte_size
40
+ register_block.byte_size
41
+ end
13
42
  end
14
43
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_simple_feature(:register_file, :c_header) do
4
+ c_header do
5
+ include RgGen::CHeader::StructBuilder
6
+
7
+ build do
8
+ build_struct
9
+ end
10
+
11
+ export def declaration
12
+ create_declaration(
13
+ struct_name, register_file.name, register_file.array_size
14
+ )
15
+ end
16
+
17
+ private
18
+
19
+ def struct_base_name
20
+ full_name
21
+ end
22
+
23
+ def byte_size
24
+ register_file.byte_size(false)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module CHeader
5
+ module StructBuilder
6
+ private
7
+
8
+ def struct_name
9
+ "#{struct_base_name}_t"
10
+ end
11
+
12
+ def build_struct
13
+ members = collect_struct_members
14
+ define_struct(struct_name, members)
15
+ end
16
+
17
+ def collect_struct_members
18
+ members = []
19
+ offset = 0
20
+ while offset < byte_size
21
+ declaration, size = define_struct_member(offset)
22
+ members << declaration
23
+ offset += size
24
+ end
25
+ members
26
+ end
27
+
28
+ def define_struct_member(offset)
29
+ entries = select_children_by_offset(offset)
30
+ if entries.size >= 2
31
+ [define_shared_union(offset, entries), entries.first.byte_size]
32
+ elsif entries.size == 1
33
+ [entries.first.declaration, entries.first.byte_size]
34
+ else
35
+ [reserved_member(offset), bus_byte_width]
36
+ end
37
+ end
38
+
39
+ def select_children_by_offset(offset)
40
+ component.children.select { |child| child.offset_address == offset }
41
+ end
42
+
43
+ def define_shared_union(offset, members)
44
+ type = "#{struct_base_name}_reg_#{hex(offset, offset_width)}_t"
45
+ name = "reg_#{hex(offset, offset_width)}"
46
+ define_union(type, members.map(&:declaration))
47
+ create_declaration(type, name)
48
+ end
49
+
50
+ def reserved_member(offset)
51
+ type = "uint#{bus_width}_t"
52
+ name = "__reserved_#{hex(offset, offset_width)}"
53
+ create_declaration(type, name)
54
+ end
55
+
56
+ def offset_width
57
+ (register_block.byte_size - 1).bit_length
58
+ end
59
+
60
+ def bus_width
61
+ configuration.bus_width
62
+ end
63
+
64
+ def bus_byte_width
65
+ configuration.byte_width
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module CHeader
5
+ module Utility
6
+ Declaration = Struct.new(:type, :name, :array_size) do
7
+ def to_s
8
+ [
9
+ type, ' ', name, array_size&.map { |size| "[#{size}]" }
10
+ ].compact.join
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module CHeader
5
+ module Utility
6
+ class StructDefinition < Core::Utility::CodeUtility::StructureDefinition
7
+ def initialize(type, name, members)
8
+ @type = type
9
+ @name = name
10
+ @members = members
11
+ super()
12
+ end
13
+
14
+ private
15
+
16
+ def code_blocks
17
+ blocks = []
18
+ blocks << [method(:header_code), 0]
19
+ blocks << [method(:body_code), 2]
20
+ blocks << [method(:footer_code), 0]
21
+ blocks
22
+ end
23
+
24
+ def header_code(code)
25
+ code << 'typedef' << space << @type << space << '{' << nl
26
+ end
27
+
28
+ def body_code(code)
29
+ @members.each do |member|
30
+ code << member << semicolon << nl
31
+ end
32
+ end
33
+
34
+ def footer_code(code)
35
+ code << '}' << space << @name << semicolon << nl
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -11,8 +11,17 @@ module RgGen
11
11
 
12
12
  private
13
13
 
14
- def hex(value)
15
- format('0x%x', value)
14
+ def hex(value, width = nil)
15
+ if width
16
+ print_width = ([1, value.bit_length, width].max + 3) / 4
17
+ format('0x%0*x', print_width, value)
18
+ else
19
+ format('0x%x', value)
20
+ end
21
+ end
22
+
23
+ def create_declaration(type, name, array_size = nil)
24
+ Declaration.new(type, name, array_size)
16
25
  end
17
26
  end
18
27
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RgGen
4
4
  module CHeader
5
- VERSION = '0.1.0'
5
+ VERSION = '0.2.0'
6
6
  end
7
7
  end
@@ -1,28 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'c_header/version'
4
+ require_relative 'c_header/utility/declaration'
5
+ require_relative 'c_header/utility/struct_definition'
4
6
  require_relative 'c_header/utility/macro_definition'
5
7
  require_relative 'c_header/utility/source_file'
6
8
  require_relative 'c_header/utility'
9
+ require_relative 'c_header/struct_builder'
7
10
  require_relative 'c_header/feature'
8
11
  require_relative 'c_header/component'
9
12
  require_relative 'c_header/factories'
10
13
 
11
- module RgGen
12
- module CHeader
13
- extend Core::Plugin
14
+ RgGen.setup_plugin :'rggen-c-header' do |plugin|
15
+ plugin.version RgGen::CHeader::VERSION
14
16
 
15
- setup_plugin :'rggen-c-header' do |plugin|
16
- plugin.register_component :c_header do
17
- component Component, ComponentFactory
18
- feature Feature, FeatureFactory
19
- end
20
-
21
- plugin.files [
22
- 'c_header/bit_field/c_header',
23
- 'c_header/register/c_header',
24
- 'c_header/register_block/c_header'
25
- ]
26
- end
17
+ plugin.register_component :c_header do
18
+ component RgGen::CHeader::Component,
19
+ RgGen::CHeader::ComponentFactory
20
+ feature RgGen::CHeader::Feature,
21
+ RgGen::CHeader::FeatureFactory
27
22
  end
23
+
24
+ plugin.files [
25
+ 'c_header/register_block/c_header',
26
+ 'c_header/register_file/c_header',
27
+ 'c_header/register/c_header',
28
+ 'c_header/bit_field/c_header'
29
+ ]
28
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rggen-c-header
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taichi Ishitani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-13 00:00:00.000000000 Z
11
+ date: 2022-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -41,16 +41,19 @@ files:
41
41
  - lib/rggen/c_header/feature.rb
42
42
  - lib/rggen/c_header/register/c_header.rb
43
43
  - lib/rggen/c_header/register_block/c_header.rb
44
- - lib/rggen/c_header/setup.rb
44
+ - lib/rggen/c_header/register_file/c_header.rb
45
+ - lib/rggen/c_header/struct_builder.rb
45
46
  - lib/rggen/c_header/utility.rb
47
+ - lib/rggen/c_header/utility/declaration.rb
46
48
  - lib/rggen/c_header/utility/macro_definition.rb
47
49
  - lib/rggen/c_header/utility/source_file.rb
50
+ - lib/rggen/c_header/utility/struct_definition.rb
48
51
  - lib/rggen/c_header/version.rb
49
52
  homepage: https://github.com/rggen/rggen-c-header
50
53
  licenses:
51
54
  - MIT
52
55
  metadata:
53
- bug_tracker_uri: https://github.com/rggen/rggen-c-header/issues
56
+ bug_tracker_uri: https://github.com/rggen/rggen/issues
54
57
  mailing_list_uri: https://groups.google.com/d/forum/rggen
55
58
  rubygems_mfa_required: 'true'
56
59
  source_code_uri: https://github.com/rggen/rggen-c-header
@@ -73,5 +76,5 @@ requirements: []
73
76
  rubygems_version: 3.3.3
74
77
  signing_key:
75
78
  specification_version: 4
76
- summary: rggen-c-header-0.1.0
79
+ summary: rggen-c-header-0.2.0
77
80
  test_files: []
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rggen/c_header'
4
-
5
- RgGen.register_plugin RgGen::CHeader do |builder|
6
- builder.enable :register_block, [:c_header]
7
- builder.enable :register, [:c_header]
8
- builder.enable :bit_field, [:c_header]
9
- end