rggen-c-header 0.1.0 → 0.2.0

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.
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