ipxact-dita 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: aba34808fe7475d865abcd1d30a4d046ecaf0619
4
+ data.tar.gz: 3bee2d0b76e862971362c6fbf22dcad034a4c17c
5
+ SHA512:
6
+ metadata.gz: 460ce36f4cd53471c193cee767a91c5895f5083504d983c486dcc40e00805b0d0e1060dd76609205335fd2caa0f648a2b89c06f662d4e0db78e6cd86fe82e251
7
+ data.tar.gz: fc2f28345bec0a568f8e5c58c9ff948c26a153aa2acab531a18573090a14de6a4d955fa6501a2d0075bca3b543b3985408c0114a900f2ff7033355feb17906a8
data/lib/ipxact.rb ADDED
@@ -0,0 +1,11 @@
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+ require_relative 'ipxact/dita/reg_fig'
3
+ require_relative 'ipxact/addr'
4
+
5
+ module Ipxact
6
+ # @param node [Element] for now, just outputs one address from <ipxact:addressOffset/>
7
+ # @return [Element] table with columns for register name and address offset
8
+ def offset_table(node)
9
+ table(%w())
10
+ end
11
+ end
@@ -0,0 +1,117 @@
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require 'con_duxml'
4
+ require_relative 'ruby_ext/string'
5
+
6
+ module Addr
7
+ include ConDuxml
8
+
9
+ HEX_POSTFIX = 'h'
10
+ HEX_PREFIX = '0x'
11
+ HEX_MAG_DIGS = 4
12
+ HEX_SEP = '_'
13
+
14
+ DEC_POSTFIX = 'd'
15
+ DEC_MAG_DIGS = 3
16
+ DEC_SEP = ','
17
+
18
+ BIN_POSTFIX = 'b'
19
+ BIN_PREFIX = '0b'
20
+ BIN_MAG_DIGS = 4
21
+ BIN_SEP = ' '
22
+
23
+ def bit_range
24
+ [position, position+width]
25
+ end
26
+
27
+ # @param str [String] string representing number; can be in any base
28
+ # @param opts [Hash] options are:
29
+ # :pre => true # radix notation goes at beginning e.g. '0x000F' - default setting
30
+ # :post => true # radix notation goes at end e.g. 'Fh'
31
+ # :sep => true # adds separator characters ('_' for hex) every 4 digits
32
+ # :pad => [Fixnum] # given value indicates total digit width of number e.g. 4 => '000Fh'
33
+ # @return [String] string representation of hex number
34
+ def to_hex(str, opts={})
35
+ s = str.to_dec.to_s(16).upcase
36
+ s = add_padding(s, opts[:pad]) if opts[:pad]
37
+
38
+ if opts[:sep]
39
+ separator = opts[:sep] == true ? HEX_SEP : opts[:sep]
40
+ s = add_separators(s, HEX_MAG_DIGS, separator)
41
+ end
42
+
43
+ if opts[:post]
44
+ s += opts[:post] == true ? HEX_POSTFIX : opts[:post]
45
+ end
46
+ if opts[:pre]
47
+ s = opts[:pre] == true ? HEX_PREFIX : opts[:pre] + s
48
+ end
49
+ s
50
+ end
51
+
52
+ # @param str [String] string representing number; can be in any base
53
+ # @param opts [Hash] options are:
54
+ # :pre => [boolean, String] # if String, notation, by default '0b'; hash key indicates position; if true,
55
+ # :post => [boolean, String] # radix notation goes at end e.g. '10b'; cannot contradict :pre
56
+ # :sep => [boolean] # adds separator characters ('_' for hex) every 4 digits
57
+ # :pad => [Fixnum] # given value indicates total digit width of number e.g. 4 => '000Fh'
58
+ # @return [String] string representation of hex number
59
+ def to_bin(str, opts={})
60
+ s = str.to_dec.to_s(2)
61
+ s = add_padding(s, 1) if opts[:pad]
62
+
63
+ if opts[:sep]
64
+ separator = opts[:sep] == true ? BIN_SEP : opts[:sep]
65
+ s = add_separators(s, BIN_MAG_DIGS, separator)
66
+ end
67
+
68
+ if opts[:post]
69
+ s += opts[:post] == true ? BIN_POSTFIX : opts[:post]
70
+ end
71
+ if opts[:pre]
72
+ s = (opts[:pre] == true ? BIN_PREFIX : opts[:pre]) + s
73
+ end
74
+ s
75
+ end
76
+
77
+ # @param str [String] number as string; can be any base or notation
78
+ # @return [String] formatted string
79
+ def to_dec(str, opts={})
80
+ s = str.to_dec.to_s
81
+ s = add_padding(s, opts[:pad]) if opts[:pad]
82
+
83
+ if opts[:sep]
84
+ separator = opts[:sep] == true ? DEC_SEP : opts[:sep]
85
+ s = add_separators(s, DEC_MAG_DIGS, separator)
86
+ end
87
+
88
+ if opts[:post]
89
+ s += opts[:post] == true ? DEC_POSTFIX : opts[:post]
90
+ end
91
+ s
92
+ end
93
+
94
+ # @param str [String] number as string
95
+ # @param places [Fixnum] number of digits for the whole number
96
+ # @return [String] string representing number
97
+ def add_padding(str, places)
98
+ padding = ''
99
+ (places - str.size).times do padding << '0' end
100
+ padding + str
101
+ end
102
+
103
+ def add_separators(str, mag, sep)
104
+ expr = Regexp.new("\\w{#{mag}}")
105
+ s = str.reverse.gsub(expr) do |m| m+sep end.reverse
106
+ str.size%mag == 0 ? s[1..-1] : s
107
+ end
108
+
109
+ private :add_separators, :add_padding
110
+
111
+ private
112
+
113
+ def get_bin_value
114
+ av = reset_value.value
115
+ self[:value].to_s(2).split(//)
116
+ end
117
+ end
@@ -0,0 +1,117 @@
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+ module Ipxact
3
+ REGFIG_MAX_ROWBITS = 32
4
+
5
+ module FigField
6
+ include Dita
7
+
8
+ @field
9
+
10
+ def gen_field_entries(_field, _word_ct)
11
+ @field = _field
12
+ @word_ct = _word_ct
13
+
14
+ entry = Element.new('entry')
15
+ if width == 1
16
+ entry[:colname] = col_start_index.to_s
17
+ else
18
+ entry[:namest] = (col_start_index).to_s
19
+ entry[:nameend] = (col_end_index+1).to_s
20
+ end
21
+ entry[:valign] = 'middle'
22
+ # entry[:outputclass] = 'rotate' if get_bit_width(name) > fig_bit_width # TODO fix this!!!
23
+ entries = gen_field_access(entry)
24
+ #entries << get_value_entries
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :word_ct, :field
30
+
31
+ def gen_field_access(entry)
32
+ read = entry
33
+ write = Element.new('entry')
34
+
35
+ #TODO pull out into Duxml#dclone?
36
+ entry.attributes.each do |k,v| write[k] = v end
37
+ unless readable?
38
+ read[:outputclass] = 'shaded'
39
+ end
40
+ if readable? == writable?
41
+ read[:morerows] = '1'
42
+ name = readable? ? gen_field_name(read) : 'Reserved'
43
+ return [name]
44
+ elsif !writable?
45
+ gen_field_name(read)
46
+ write[:outputclass] = 'shaded'
47
+ elsif !readable?
48
+ gen_field_name(write)
49
+ else
50
+ # do nothing
51
+ end
52
+ [read, write]
53
+ end
54
+
55
+ def readable?
56
+ access = field.locate('ipxact:access').first
57
+ access = source.access.text unless access
58
+ access.include?('read')
59
+ end
60
+
61
+ def writable?
62
+ access = field.locate('ipxact:access').first
63
+ access = source.access.text unless access
64
+ access.include?('write')
65
+ end
66
+
67
+ def get_value_entries
68
+ v = []
69
+ width.times do |i|
70
+ b = bits[i] ? bits[i] : 0
71
+ v << e = Element.new('entry')
72
+ e << b.to_s
73
+ end
74
+ v
75
+ end
76
+
77
+ def gen_field_name(entry)
78
+ if field_name.nil?
79
+ entry << '-'
80
+ else
81
+ entry << Element.new('xref')
82
+ entry.xref[:href] = get_xref
83
+ entry.xref << field_name
84
+ end
85
+ entry
86
+ end
87
+
88
+ def field_name
89
+ n = field.locate('ipxact:name')
90
+ n.empty? ? nil : n.first.text
91
+ end
92
+
93
+ def get_xref
94
+ "NOT_IMPLEMENTED" # TODO
95
+ end
96
+
97
+ def col_end_index
98
+ ms_pos - word_ct * REGFIG_MAX_ROWBITS
99
+ end
100
+
101
+ def col_start_index
102
+ ls_pos - word_ct * REGFIG_MAX_ROWBITS + 1
103
+ end
104
+
105
+ def width
106
+ field.bitWidth.text.to_i
107
+ end
108
+
109
+ def ls_pos
110
+ field.bitOffset.text.to_i
111
+ end
112
+
113
+ def ms_pos
114
+ field.bitOffset.text.to_i + field.bitWidth.text.to_i - 1
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,113 @@
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require 'con_duxml'
4
+ require 'ruby-dita'
5
+ require_relative 'fig_field'
6
+
7
+ module Ipxact
8
+ include Dita
9
+ include FigField
10
+
11
+ # counts number of words of figure generated so far, where size of word is defined by REGFIG_MAX_ROWBITS
12
+ @word_ct
13
+
14
+ attr_reader :word_ct
15
+
16
+ # @param opts [Hash] no options currently supported TODO add options for hide access, hide reset value, etc.
17
+ # @return [Element] visual rendering of register and its fields in Dita table form; content from <ipxact:register/> in @source
18
+ def reg_fig(opts={})
19
+ src = source # TODO not sure if this is ideal, but works for now
20
+ table = Element.new('table')
21
+ table[:id] = object_id.to_s+"_regFigure"
22
+ table[:frame] = 'all'
23
+ table[:outputclass] = 'crr.regFigure regtable'
24
+ @word_ct = 0
25
+ input = src.locate(src_ns + ':field')
26
+ tgroup = nil
27
+ until input.empty? do
28
+ field = input.pop
29
+ index = row_relative_index field
30
+ if tgroup.nil?
31
+ tgroup = gen_tgroup
32
+ table << tgroup
33
+ end
34
+ if index > REGFIG_MAX_ROWBITS
35
+ table << tgroup = gen_tgroup
36
+ input << field.split do |bit| bit end
37
+ next
38
+ else
39
+ entries = gen_field_entries(field, word_ct)
40
+ tgroup.tbody.nodes[1] << entries.first
41
+ tgroup.tbody.nodes[2] << entries[1] if entries.size > 2
42
+ tgroup.tbody.nodes[3] << entries.last if entries.last.is_a?(Array)
43
+ end
44
+ if field_pos(field) == 0 || index >= REGFIG_MAX_ROWBITS
45
+ @word_ct += 1 unless field_pos(field) == 0
46
+ end
47
+ end
48
+ table
49
+ end
50
+
51
+ def row_relative_index(field)
52
+ field_pos(field) + field_width(field) - word_ct*REGFIG_MAX_ROWBITS
53
+ end
54
+
55
+ def small?
56
+ reg_size < REGFIG_MAX_ROWBITS
57
+ end
58
+
59
+ def large?
60
+ reg_size > 64
61
+ end
62
+
63
+ def field_pos(field)
64
+ field.bitOffset.text.to_i
65
+ end
66
+
67
+ def field_width(field)
68
+ field.bitWidth.text.to_i
69
+ end
70
+
71
+ def gen_tgroup
72
+ tgroup = Element.new('tgroup')
73
+ tgroup[:cols] ||= num_cols
74
+ num_cols.times do |i|
75
+ tgroup << colspec = Element.new('colspec')
76
+ colspec[:align] = 'center'
77
+ colspec[:colname] = i.to_s
78
+ end
79
+
80
+ tgroup << Element.new('tbody')
81
+ %w(Bits R W Reset).each do |heading|
82
+ tgroup.tbody << row = Element.new('row')
83
+ row << Element.new('entry')
84
+ row.entry << heading
85
+ end
86
+
87
+ set_bit_heading! tgroup.tbody.nodes.first
88
+ tgroup
89
+ end
90
+
91
+ def set_bit_heading!(bit_row)
92
+ fig_bit_width.times do |i|
93
+ bit_row << e = Element.new('entry')
94
+ e << (fig_bit_width - i-1).to_s
95
+ end
96
+ end
97
+
98
+ def reg_size
99
+ source.size.text.to_i
100
+ end
101
+
102
+ def fig_bit_width
103
+ REGFIG_MAX_ROWBITS > reg_size ? reg_size : REGFIG_MAX_ROWBITS
104
+ end
105
+
106
+ def bit_range
107
+ "#{(field_pos(source) + field_width(source) - 1).to_s} - #{field_pos(source).to_s}"
108
+ end
109
+
110
+ def num_cols
111
+ fig_bit_width+1
112
+ end
113
+ end
@@ -0,0 +1,34 @@
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+ PREFIX_HEX = /^('h|0x)[0-9A-Fa-f]+$/
3
+ POSTFIX_HEX = /^[0-9A-Fa-f]+h$/
4
+ PREFIX_BIN = /^['0]b[01]+$/
5
+ POSTFIX_BIN = /^[0-1]+b$/
6
+ DECIMAL = /^[0-9]+$/
7
+ NAKED_HEX = /^[0-9A-Fa-f]+$/
8
+
9
+ class String
10
+ # @return [Fixnum] returns base of number represented by this string e.g. '0x0F' => 16
11
+ def base
12
+ case self
13
+ when PREFIX_BIN, POSTFIX_BIN
14
+ 2
15
+ when PREFIX_HEX, POSTFIX_HEX, NAKED_HEX
16
+ 16
17
+ when DECIMAL
18
+ 10
19
+ else
20
+ nil
21
+ end
22
+ end
23
+
24
+ # @return [Fixnum] returns numerical value of string in decimal form
25
+ def to_dec
26
+ case self
27
+ when PREFIX_BIN, PREFIX_HEX then self[2..-1]
28
+ when POSTFIX_HEX, POSTFIX_BIN then self[0..-2]
29
+ when DECIMAL, NAKED_HEX then self
30
+ else
31
+ raise Exception, "'#{self}' is not a numerical string!"
32
+ end.to_i(base)
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ require 'ipxact'
2
+
3
+ module Ipxact
4
+ module Magillem
5
+ def do_something
6
+
7
+ end
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ipxact-dita
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter Kong
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: duxml
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.8.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.8.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-dita
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.4'
41
+ description: see README.md
42
+ email:
43
+ - peter.kong@nxp.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/ipxact/addr.rb
49
+ - lib/ipxact/dita/fig_field.rb
50
+ - lib/ipxact/dita/reg_fig.rb
51
+ - lib/ipxact/ruby_ext/string.rb
52
+ - lib/ipxact/vendor_extensions/magillem_ipxact.rb
53
+ - lib/ipxact.rb
54
+ homepage: http://www.github.com/Ludocracy/ip-xact
55
+ licenses:
56
+ - MIT
57
+ metadata: {}
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 1.9.3
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 1.8.11
72
+ requirements: []
73
+ rubyforge_project:
74
+ rubygems_version: 2.0.14.1
75
+ signing_key:
76
+ specification_version: 4
77
+ summary: Ruby interface for IP-XACT semiconductor component model including documentation
78
+ generation
79
+ test_files: []