origen_doc_helpers 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/config/application.rb +34 -0
  3. data/config/commands.rb +42 -0
  4. data/config/development.rb +16 -0
  5. data/config/environment.rb +30 -0
  6. data/config/users.rb +19 -0
  7. data/config/version.rb +8 -0
  8. data/lib/helpers.rb +234 -0
  9. data/lib/origen_doc_helpers.rb +2 -0
  10. data/lib/origen_doc_helpers/doc_interface.rb +74 -0
  11. data/lib/origen_doc_helpers/dut.rb +194 -0
  12. data/lib/origen_doc_helpers/pdf.rb +122 -0
  13. data/program/_func.rb +12 -0
  14. data/program/_hvst.rb +12 -0
  15. data/program/_para.rb +26 -0
  16. data/program/probe_1.rb +7 -0
  17. data/templates/pdf/topic_wrapper.html +21 -0
  18. data/templates/shared/_register.html.erb +207 -0
  19. data/templates/shared/_searchable.html.erb +86 -0
  20. data/templates/shared/_spec.html.erb +20 -0
  21. data/templates/shared/test/_flow.md.erb +227 -0
  22. data/templates/web/examples.md.erb +19 -0
  23. data/templates/web/examples/register.md.erb +101 -0
  24. data/templates/web/examples/searchable/intro.md.erb +128 -0
  25. data/templates/web/examples/searchable/page2.md.erb +5 -0
  26. data/templates/web/examples/searchable/topic1/item1.md.erb +5 -0
  27. data/templates/web/examples/searchable/topic1/item2.html.erb +7 -0
  28. data/templates/web/examples/spec.md.erb_NOT_WORKING +42 -0
  29. data/templates/web/examples/test/flow.md.erb +35 -0
  30. data/templates/web/examples/yammer.md.erb +28 -0
  31. data/templates/web/index.md.erb +40 -0
  32. data/templates/web/layouts/_basic.html.erb +13 -0
  33. data/templates/web/layouts/_doc.html.erb +22 -0
  34. data/templates/web/layouts/_examples.html.erb +5 -0
  35. data/templates/web/partials/_navbar.html.erb +21 -0
  36. data/templates/web/release_notes.md.erb +5 -0
  37. metadata +94 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d89354a4f13aed042c3fdbb0fb42ef325db4612f
4
+ data.tar.gz: 19c9c7af0631ba313222d0d485b8e8707b7bdf0f
5
+ SHA512:
6
+ metadata.gz: 278a9668b54e8a4bd8243be6e994bc168c23130d5b31025c3c26b28051ab521c6d843e6c52337895f80b2d98dce79725400c24dea783f368907e37a3d45b17bc
7
+ data.tar.gz: 4ec1d7913206ac96248ebe5cc602d7c8c5d1be984dedf28f316c2ffa880c350833be4fb768830a82a442da689a5658a79b5f3ff5aa553abf58d6c89ace470c8e
@@ -0,0 +1,34 @@
1
+ require "origen"
2
+ class OrigenDocHelpersApplication < Origen::Application
3
+
4
+ config.name = "Origen Documentation Helpers"
5
+ config.initials = "OrigenDocHelpers"
6
+ config.rc_url = "git@github.com:Origen-SDK/origen_doc_helpers"
7
+ config.release_externally = true
8
+ # To enable deployment of your documentation to a web server (via the 'origen web'
9
+ # command) fill in these attributes.
10
+ config.web_directory = "git@github.com:Origen-SDK/Origen-SDK.github.io.git/doc_helpers"
11
+ config.web_domain = "http://origen-sdk.org/doc_helpers"
12
+
13
+ config.semantically_version = true
14
+
15
+ config.lint_test = {
16
+ # Require the lint tests to pass before allowing a release to proceed
17
+ :run_on_tag => true,
18
+ # Auto correct violations where possible whenever 'origen lint' is run
19
+ :auto_correct => true,
20
+ # Limit the testing for large legacy applications
21
+ #:level => :easy,
22
+ # Run on these directories/files by default
23
+ #:files => ["lib", "config/application.rb"],
24
+ }
25
+
26
+ # To automatically deploy your documentation after every tag use this code
27
+ def after_release_email(tag, note, type, selector, options)
28
+ command = "origen web compile --remote"
29
+ Dir.chdir Origen.root do
30
+ system command
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,42 @@
1
+ # This file should be used to extend the origen command line tool with tasks
2
+ # specific to your application.
3
+ # The comments below should help to get started and you can also refer to
4
+ # lib/origen/commands.rb in your Origen core workspace for more examples and
5
+ # inspiration.
6
+ #
7
+ # Also see the official docs on adding commands:
8
+ # http://origen.freescale.net/origen/latest/guides/custom/commands/
9
+
10
+ # Map any command aliases here, for example to allow origen -x to refer to a
11
+ # command called execute you would add a reference as shown below:
12
+ aliases ={
13
+ # "-x" => "execute",
14
+ }
15
+
16
+ # The requested command is passed in here as @command, this checks it against
17
+ # the above alias table and should not be removed.
18
+ @command = aliases[@command] || @command
19
+
20
+ # Now branch to the specific task code
21
+ case @command
22
+
23
+ # Here is an example of how to implement a command, the logic can go straight
24
+ # in here or you can require an external file if preferred.
25
+ when "execute"
26
+ puts "Executing something..."
27
+ require "commands/execute" # Would load file lib/commands/execute.rb
28
+ # You must always exit upon successfully capturing a command to prevent
29
+ # control flowing back to Origen
30
+ exit 0
31
+
32
+ # Always leave an else clause to allow control to fall back through to the
33
+ # Origen command handler.
34
+ # You probably want to also add the command details to the help shown via
35
+ # origen -h, you can do this be assigning the required text to @application_commands
36
+ # before handing control back to Origen. Un-comment the example below to get started.
37
+ else
38
+ # @application_commands = <<-EOT
39
+ # execute Execute something I guess
40
+ # EOT
41
+
42
+ end
@@ -0,0 +1,16 @@
1
+ # This file is similar to environment.rb and will be loaded
2
+ # automatically at the start of each invocation of Origen.
3
+ #
4
+ # However the major difference is that it will not be loaded
5
+ # if the application is imported by a 3rd party app - in that
6
+ # case only environment.rb is loaded.
7
+ #
8
+ # Therefore this file should be used to load anything you need
9
+ # to setup a development environment for this app, normally
10
+ # this would be used to load some dummy classes to instantiate
11
+ # your objects so that they can be tested and/or interacted with
12
+ # in the console.
13
+ module OrigenDocHelpers
14
+ autoload :DUT, "origen_doc_helpers/dut"
15
+ end
16
+ require "origen_doc_helpers/doc_interface"
@@ -0,0 +1,30 @@
1
+ # This file will be required by Origen before your target is loaded, you
2
+ # can use this to require all of your files, which is the easiest way
3
+ # to get started. As your experience grows you may wish to require only the
4
+ # minimum files required to allow the target to be initialized and let
5
+ # each class require its own dependencies.
6
+ #
7
+ # It is recommended that you keep all of your application logic in lib/
8
+ # The lib directory has already been added to the search path and so any files
9
+ # in there can be referenced from here with a relative path.
10
+ #
11
+ # Note that pattern files do not need to be referenced from here and these
12
+ # will be located automatically by origen.
13
+
14
+ # This says load the file "lib/pioneer.rb" the first time anyone makes a
15
+ # reference to the class name 'Pioneer'.
16
+ #autoload :Pioneer, "pioneer"
17
+ # This is generally preferable to using require which will load the file
18
+ # regardless of whether it is needed by the current target or not:
19
+ #require "pioneer"
20
+ # Sometimes you have to use require however:-
21
+ # 1. When defining a test program interface:
22
+ #require "interfaces/j750"
23
+ # 2. If you want to extend a class defined by an imported application, in
24
+ # this case your must use required and supply a full path (to distinguish
25
+ # it from the one in the parent application):
26
+ #require "#{Origen.root}/c90_top_level/p2"
27
+ module OrigenDocHelpers
28
+ autoload :PDF, "origen_doc_helpers/pdf"
29
+ end
30
+ require "helpers"
data/config/users.rb ADDED
@@ -0,0 +1,19 @@
1
+ # This file defines the users associated with your project, it is basically the
2
+ # mailing list for release notes.
3
+ #
4
+ # You can split your users into "admin" and "user" groups, the main difference
5
+ # between the two is that admin users will get all tag emails, users will get
6
+ # emails on external/official releases only.
7
+ #
8
+ # Users are also prohibited from running the "origen tag" task, but this is
9
+ # really just to prevent a casual user from executing it inadvertently and is
10
+ # not intended to be a serious security gate.
11
+ module Origen
12
+ module Users
13
+ def users
14
+ @users ||= [
15
+
16
+ ]
17
+ end
18
+ end
19
+ end
data/config/version.rb ADDED
@@ -0,0 +1,8 @@
1
+ module OrigenDocHelpers
2
+ MAJOR = 0
3
+ MINOR = 1
4
+ BUGFIX = 0
5
+ DEV = nil
6
+
7
+ VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
8
+ end
data/lib/helpers.rb ADDED
@@ -0,0 +1,234 @@
1
+ module Origen
2
+ class Generator
3
+ class Compiler
4
+ module DocHelpers
5
+ # Helpers to create Yammer widgets
6
+ module Yammer
7
+ def yammer_comments(options = {})
8
+ options = {
9
+ prompt: 'Comment on this page'
10
+ }.merge(options)
11
+
12
+ options[:group_id] ||= Origen.app.config.yammer_group
13
+
14
+ <<END
15
+ <div style="position: relative">
16
+ <hr>
17
+ <h4>Comments</h4>
18
+
19
+ <div id="embedded-follow" style="position:absolute; top: 18px; left: 100px;"></div>
20
+ <div id="embedded-feed" style="height:800px;width:600px;"></div>
21
+ </div>
22
+
23
+ <script type="text/javascript" src="https://c64.assets-yammer.com/assets/platform_embed.js"></script>
24
+
25
+ <script>
26
+ yam.connect.actionButton({
27
+ container: "#embedded-follow",
28
+ network: "freescale.com",
29
+ action: "follow"
30
+ });
31
+ </script>
32
+
33
+ <script>
34
+ yam.connect.embedFeed({
35
+ container: "#embedded-feed",
36
+ feedType: "open-graph",
37
+ config: {
38
+ header: false,
39
+ footer: false,
40
+ defaultGroupId: '#{options[:group_id]}',
41
+ promptText: '#{options[:prompt]}'
42
+ },
43
+ objectProperties: {
44
+ type: 'page',
45
+ url: '#{current_latest_url}'
46
+ }
47
+ });
48
+ </script>
49
+ END
50
+ end
51
+ end
52
+ include Yammer
53
+
54
+ # Helpers for the register diagrams
55
+ module RegisterHelpers
56
+ # Returns true if some portion of the given bits falls
57
+ # within the given range
58
+ def _bit_in_range?(bits, max, min)
59
+ upper = bits.position + bits.size - 1
60
+ lower = bits.position
61
+ !((lower > max) || (upper < min))
62
+ end
63
+
64
+ # Returns the number of bits from the given bits that
65
+ # fall within the given range
66
+ def _num_bits_in_range(bits, max, min)
67
+ upper = bits.position + bits.size - 1
68
+ lower = bits.position
69
+ [upper, max].min - [lower, min].max + 1
70
+ end
71
+
72
+ # Returns true if the given number is is the
73
+ # given range
74
+ def _index_in_range?(i, max, min)
75
+ !((i > max) || (i < min))
76
+ end
77
+
78
+ def _bit_rw(bits)
79
+ str = ''
80
+ if bits.readable?
81
+ str += 'readable'
82
+ else
83
+ str += 'not-readable'
84
+ end
85
+ if bits.writable?
86
+ str += ' writable'
87
+ else
88
+ str += ' not-writable'
89
+ end
90
+ str.strip
91
+ end
92
+
93
+ def _max_bit_in_range(bits, max, _min)
94
+ upper = bits.position + bits.size - 1
95
+ [upper, max].min - bits.position
96
+ end
97
+
98
+ def _min_bit_in_range(bits, _max, min)
99
+ lower = bits.position
100
+ [lower, min].max - bits.position
101
+ end
102
+ end
103
+ include RegisterHelpers
104
+
105
+ # Helpers for the test flow documentation
106
+ module TestFlowHelpers
107
+ def _test_to_local_link(test)
108
+ name = _test_name(test)
109
+ number = _test_number(test)
110
+ "<a href='##{name}_#{number}'>#{name}</a>"
111
+ end
112
+
113
+ def _test_name(test)
114
+ test[:flow][:name] || test[:instance].first[:name]
115
+ end
116
+
117
+ def _test_number(test)
118
+ flow = test[:flow]
119
+ flow[:number] || flow[:test_number] || flow[:tnum]
120
+ end
121
+
122
+ def _bin_number(test)
123
+ flow = test[:flow]
124
+ flow[:bin] || flow[:hard_bin] || flow[:hardbin] || flow[:soft_bin] || flow[:softbin]
125
+ end
126
+
127
+ def _sbin_number(test)
128
+ flow = test[:flow]
129
+ flow[:soft_bin] || flow[:softbin]
130
+ end
131
+
132
+ def _start_accordion(heading, _options = {})
133
+ @_accordion_index ||= 0
134
+ @_accordion_index += 1
135
+ <<-END
136
+ <div class="panel panel-default">
137
+ <a href="#_" class="expandcollapse btn btn-xs pull-right btn-default" state="0"><i class='fa fa-plus'></i></a>
138
+ <div class="panel-heading clickable" style="background:whitesmoke" data-toggle="collapse" data-parent="#blah2" href="#collapseAccordion#{@_accordion_index}">
139
+ <a class="no-underline">
140
+ #{heading}
141
+ </a>
142
+ </div>
143
+ <div id="collapseAccordion#{@_accordion_index}" class="panel-collapse collapse">
144
+ <div class="panel-body" markdown="1">
145
+
146
+ END
147
+ end
148
+
149
+ def _stop_accordion
150
+ <<-END
151
+
152
+ </div>
153
+ </div>
154
+ </div>
155
+ END
156
+ end
157
+
158
+ def _start_test_flow_table
159
+ if @_test_flow_table_open
160
+ ''
161
+ else
162
+ @_test_flow_table_open = true
163
+ <<-END
164
+ <table class="table table-condensed table-bordered flow-table">
165
+
166
+ <thead>
167
+ <tr>
168
+ <th class="col1">Test</th>
169
+ <th class="col2">Number</th>
170
+ <th class="col3">HBin</th>
171
+ <th class="col3">SBin</th>
172
+ <th class="col5">Attributes</th>
173
+ <th class="col6">Description</th>
174
+ </tr>
175
+ </thead>
176
+
177
+ <tbody>
178
+ END
179
+ end
180
+ end
181
+
182
+ def _stop_test_flow_table
183
+ if @_test_flow_table_open
184
+ @_test_flow_table_open = false
185
+ <<-END
186
+
187
+ </tbody>
188
+ </table>
189
+ END
190
+ else
191
+ ''
192
+ end
193
+ end
194
+ end
195
+ include TestFlowHelpers
196
+
197
+ # Helpers for the searchable doc layout
198
+ module SearchableHelpers
199
+ def _doc_root_dir(options)
200
+ f = options[:root]
201
+ @_doc_root_dirs ||= {}
202
+ return @_doc_root_dirs[f] if @_doc_root_dirs[f]
203
+ unless File.exist?(f)
204
+ f = Pathname.new("#{Origen.root}/templates/web/#{f}")
205
+ unless f.exist?
206
+ fail "#{options[:root]} does not exist!"
207
+ end
208
+ end
209
+ f = Pathname.new(f) if f.is_a?(String)
210
+ @_doc_root_dirs[options[:root]] = f
211
+ end
212
+
213
+ def _resolve_tab(options)
214
+ tab = tab.to_s.downcase
215
+ active = false
216
+ if options[:tab]
217
+ options[:tab]
218
+ else
219
+ rel = options[:top_level_file].relative_path_from(_doc_root_dir(options)).sub_ext('').sub_ext('').to_s
220
+ rel.gsub(/(\/|\\)/, '_').downcase.to_sym
221
+ end
222
+ end
223
+
224
+ def _root_path(options)
225
+ root = Pathname.new("#{Origen.root}/templates/web")
226
+ _doc_root_dir(options).relative_path_from(root)
227
+ end
228
+ end
229
+ include SearchableHelpers
230
+ end
231
+ include DocHelpers
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,2 @@
1
+ require_relative '../config/application.rb'
2
+ require_relative '../config/environment.rb'
@@ -0,0 +1,74 @@
1
+ module OrigenDocHelpers
2
+ class DocInterface
3
+ include Origen::Tester::Doc::Generator
4
+
5
+ def initialize(_options = {})
6
+ end
7
+
8
+ def log(_msg)
9
+ end
10
+
11
+ def instance_name(name, options = {})
12
+ name = pattern_name(name)
13
+ if options[:vdd] || options[:vdd] != :nom
14
+ name += "_#{options[:vdd]}"
15
+ end
16
+ name
17
+ end
18
+
19
+ def pattern_name(name, _options = {})
20
+ name.to_s
21
+ end
22
+
23
+ def vdd_loop(options)
24
+ [options[:vdd]].flatten.each do |vdd|
25
+ yield options.merge(vdd: vdd)
26
+ end
27
+ end
28
+
29
+ def func(name, options = {})
30
+ options = {
31
+ vdd: [:min, :max],
32
+ type: :functional
33
+ }.merge(options)
34
+ vdd_loop(options) do |options|
35
+ test = add_test name, options
36
+ add_flow_entry(test, options)
37
+ end
38
+ end
39
+
40
+ def para(name, options = {})
41
+ options = {
42
+ vdd: [:min, :max],
43
+ type: :parametric
44
+ }.merge(options)
45
+ vdd_loop(options) do |options|
46
+ test = add_test name, options
47
+ add_flow_entry(test, options)
48
+ end
49
+ end
50
+
51
+ def add_pattern(name, options = {})
52
+ options[:pattern] = pattern_name(name, options)
53
+ options
54
+ end
55
+
56
+ def add_test(name, options)
57
+ options = {
58
+ }.merge(options)
59
+ # Delete any keys that we don't want to assign to the instance, this keeps
60
+ # the attributes efficient, flow control keys will be screened by Origen
61
+ [:bin, :tnum, :tname, :continue
62
+ ].each { |k| options.delete(k) }
63
+ tests.add(instance_name(name, options), add_pattern(name, options))
64
+ end
65
+
66
+ def add_flow_entry(test, options)
67
+ options = {
68
+ number: options[:bin] * 1000,
69
+ soft_bin: options[:bin]
70
+ }.merge(options)
71
+ flow.test test, options
72
+ end
73
+ end
74
+ end