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 +4 -4
- data/README.md +5 -16
- data/lib/rggen/c_header/component.rb +9 -2
- data/lib/rggen/c_header/feature.rb +14 -0
- data/lib/rggen/c_header/register/c_header.rb +12 -10
- data/lib/rggen/c_header/register_block/c_header.rb +29 -0
- data/lib/rggen/c_header/register_file/c_header.rb +27 -0
- data/lib/rggen/c_header/struct_builder.rb +69 -0
- data/lib/rggen/c_header/utility/declaration.rb +15 -0
- data/lib/rggen/c_header/utility/struct_definition.rb +40 -0
- data/lib/rggen/c_header/utility.rb +11 -2
- data/lib/rggen/c_header/version.rb +1 -1
- data/lib/rggen/c_header.rb +17 -15
- metadata +8 -5
- data/lib/rggen/c_header/setup.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4150e4e77b8fee78e7832a812c4332ce5b56f016c1caa803c23dd2ee032fad55
|
4
|
+
data.tar.gz: 372b8614c051deee871ab887a24930c02d8d93cc97401aa937541f1d6b5fcde9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
##
|
11
|
+
## Installati
|
12
12
|
|
13
|
-
|
13
|
+
During RgGen installation, RgGen::CHeader will also be installed autoamtically.
|
14
14
|
|
15
15
|
```
|
16
|
-
$ gem install rggen
|
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
|
-
|
19
|
+
If you want to install RgGen::CHeader only, use the command below.
|
30
20
|
|
31
21
|
```
|
32
|
-
$
|
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
|
-
@
|
9
|
-
@
|
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
|
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
|
-
|
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
|
data/lib/rggen/c_header.rb
CHANGED
@@ -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
|
-
|
12
|
-
|
13
|
-
extend Core::Plugin
|
14
|
+
RgGen.setup_plugin :'rggen-c-header' do |plugin|
|
15
|
+
plugin.version RgGen::CHeader::VERSION
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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.
|
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-
|
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/
|
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
|
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.
|
79
|
+
summary: rggen-c-header-0.2.0
|
77
80
|
test_files: []
|
data/lib/rggen/c_header/setup.rb
DELETED