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