Skip to content

Commit 214d580

Browse files
authored
Refactor for backend, plus (#5)
* Refactor to make backends explict. Also: * Make all .yaml files in arch/ valid YAML (ERB is only used in strings) * Make Csr, Instruction, Extension objects independent of an ArchDef * Lots of updates to counter/hpm CSRs to better reflect all the implementation options
1 parent 09448b6 commit 214d580

File tree

467 files changed

+29687
-2249
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

467 files changed

+29687
-2249
lines changed

Rakefile

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
# frozen_string_literal: true
2+
3+
$root = Pathname.new(__FILE__).dirname.realpath
4+
$lib = $root / "lib"
5+
6+
require "yard"
7+
require "minitest/test_task"
8+
9+
require_relative $root / "lib" / "validate"
10+
11+
directory "#{$root}/.stamps"
12+
13+
Dir.glob("#{$root}/backends/*/tasks.rake") do |rakefile|
14+
load rakefile
15+
end
16+
17+
directory "#{$root}/.stamps"
18+
19+
file "#{$root}/.stamps/dev_gems" => "#{$root}/.stamps" do
20+
Dir.chdir($root) do
21+
sh "bundle config set --local with development"
22+
sh "bundle install"
23+
FileUtils.touch "#{$root}/.stamps/dev_gems"
24+
end
25+
end
26+
27+
namespace :gen do
28+
desc "Generate documentation for the ruby tooling"
29+
task tool_doc: "#{$root}/.stamps/dev_gems" do
30+
Dir.chdir($root) do
31+
sh "bundle exec yard doc"
32+
end
33+
end
34+
end
35+
36+
namespace :serve do
37+
desc <<~DESC
38+
Start an HTML server to view the generated HTML documentation for the tool
39+
40+
The default port is 8000, though it can be overridden with an argument
41+
DESC
42+
task :tool_doc, [:port] => "gen:tool_doc" do |_t, args|
43+
args.with_defaults(port: 8000)
44+
45+
puts <<~MSG
46+
Server will come up on http://#{`hostname`.strip}:#{args[:port]}.
47+
It will regenerate the documentation on every access
48+
49+
MSG
50+
sh "yard server -p #{args[:port]} --reload"
51+
end
52+
end
53+
54+
Minitest::TestTask.create :idl_test do |t|
55+
t.test_globs = ["#{$root}/lib/idl/tests/test_*.rb"]
56+
end
57+
58+
desc "Clean up all generated files"
59+
task :clean do
60+
FileUtils.rm_rf $root / "gen"
61+
FileUtils.rm_rf $root / ".stamps"
62+
end
63+
64+
desc "Validate the arch docs"
65+
task validate: "gen:arch" do
66+
validator = Validator.instance
67+
Dir.glob("#{$root}/arch/**/*.yaml") do |f|
68+
validator.validate(f)
69+
end
70+
puts "All files validate against their schema"
71+
end
72+
73+
def insert_warning(str, from)
74+
# insert a warning on the second line
75+
lines = str.lines
76+
first_line = lines.shift
77+
lines.unshift(first_line, "\n# WARNING: This file is auto-generated from #{Pathname.new(from).relative_path_from($root)}\n\n").join("")
78+
end
79+
80+
(3..31).each do |hpm_num|
81+
file "#{$root}/arch/csr/Zihpm/mhpmcounter#{hpm_num}.yaml" => [
82+
"#{$root}/arch/csr/Zihpm/mhpmcounterN.layout",
83+
__FILE__
84+
] do |t|
85+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
86+
erb = ERB.new(File.read($root / "arch/csr/Zihpm/mhpmcounterN.layout"), trim_mode: "-")
87+
erb.filename = "#{$root}/arch/csr/Zihpm/mhpmcounterN.layout"
88+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
89+
end
90+
file "#{$root}/arch/csr/Zihpm/mhpmcounter#{hpm_num}h.yaml" => [
91+
"#{$root}/arch/csr/Zihpm/mhpmcounterNh.layout",
92+
__FILE__
93+
] do |t|
94+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
95+
erb = ERB.new(File.read($root / "arch/csr/Zihpm/mhpmcounterNh.layout"), trim_mode: "-")
96+
erb.filename = "#{$root}/arch/csr/Zihpm/mhpmcounterNh.layout"
97+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
98+
end
99+
file "#{$root}/arch/csr/Zihpm/mhpmevent#{hpm_num}.yaml" => [
100+
"#{$root}/arch/csr/Zihpm/mhpmeventN.layout",
101+
__FILE__
102+
] do |t|
103+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
104+
erb = ERB.new(File.read($root / "arch/csr/Zihpm/mhpmeventN.layout"), trim_mode: "-")
105+
erb.filename = "#{$root}/arch/csr/Zihpm/mhpmeventN.layout"
106+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
107+
end
108+
file "#{$root}/arch/csr/Zihpm/mhpmevent#{hpm_num}h.yaml" => [
109+
"#{$root}/arch/csr/Zihpm/mhpmeventNh.layout",
110+
__FILE__
111+
] do |t|
112+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
113+
erb = ERB.new(File.read($root / "arch/csr/Zihpm/mhpmeventNh.layout"), trim_mode: "-")
114+
erb.filename = "#{$root}/arch/csr/Zihpm/mhpmeventNh.layout"
115+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
116+
end
117+
file "#{$root}/arch/csr/Zihpm/hpmcounter#{hpm_num}.yaml" => [
118+
"#{$root}/arch/csr/Zihpm/hpmcounterN.layout",
119+
__FILE__
120+
] do |t|
121+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
122+
erb = ERB.new(File.read($root / "arch/csr/Zihpm/hpmcounterN.layout"), trim_mode: "-")
123+
erb.filename = "#{$root}/arch/csr/Zihpm/hpmcounterN.layout"
124+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
125+
end
126+
file "#{$root}/arch/csr/Zihpm/hpmcounter#{hpm_num}h.yaml" => [
127+
"#{$root}/arch/csr/Zihpm/hpmcounterNh.layout",
128+
__FILE__
129+
] do |t|
130+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
131+
erb = ERB.new(File.read($root / "arch/csr/Zihpm/hpmcounterNh.layout"), trim_mode: "-")
132+
erb.filename = "#{$root}/arch/csr/Zihpm/hpmcounterNh.layout"
133+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
134+
end
135+
end
136+
137+
(0..63).each do |pmpaddr_num|
138+
file "#{$root}/arch/csr/I/pmpaddr#{pmpaddr_num}.yaml" => [
139+
"#{$root}/arch/csr/I/pmpaddrN.layout",
140+
__FILE__
141+
] do |t|
142+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
143+
erb = ERB.new(File.read($root / "arch/csr/I/pmpaddrN.layout"), trim_mode: "-")
144+
erb.filename = "#{$root}/arch/csr/I/pmpaddrN.layout"
145+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
146+
end
147+
end
148+
149+
(0..15).each do |pmpcfg_num|
150+
file "#{$root}/arch/csr/I/pmpcfg#{pmpcfg_num}.yaml" => [
151+
"#{$root}/arch/csr/I/pmpcfgN.layout",
152+
__FILE__
153+
] do |t|
154+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
155+
erb = ERB.new(File.read($root / "arch/csr/I/pmpcfgN.layout"), trim_mode: "-")
156+
erb.filename = "#{$root}/arch/csr/I/pmpcfgN.layout"
157+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
158+
end
159+
end
160+
161+
file "#{$root}/arch/csr/I/mcounteren.yaml" => [
162+
"#{$root}/arch/csr/I/mcounteren.layout",
163+
__FILE__
164+
] do |t|
165+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
166+
erb = ERB.new(File.read($root / "arch/csr/I/mcounteren.layout"), trim_mode: "-")
167+
erb.filename = "#{$root}/arch/csr/I/mcounteren.layout"
168+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
169+
end
170+
171+
file "#{$root}/arch/csr/S/scounteren.yaml" => [
172+
"#{$root}/arch/csr/S/scounteren.layout",
173+
__FILE__
174+
] do |t|
175+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
176+
erb = ERB.new(File.read($root / "arch/csr/S/scounteren.layout"), trim_mode: "-")
177+
erb.filename = "#{$root}/arch/csr/S/scounteren.layout"
178+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
179+
end
180+
181+
file "#{$root}/arch/csr/Zicntr/mcountinhibit.yaml" => [
182+
"#{$root}/arch/csr/Zicntr/mcountinhibit.layout",
183+
__FILE__
184+
] do |t|
185+
puts "Generating #{Pathname.new(t.name).relative_path_from($root)}"
186+
erb = ERB.new(File.read($root / "arch/csr/Zicntr/mcountinhibit.layout"), trim_mode: "-")
187+
erb.filename = "#{$root}/arch/csr/Zicntr/mcountinhibit.layout"
188+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
189+
end
190+
191+
namespace :gen do
192+
desc "Generate architecture files from layouts"
193+
task :arch do
194+
(3..31).each do |hpm_num|
195+
Rake::Task["#{$root}/arch/csr/Zihpm/mhpmcounter#{hpm_num}.yaml"].invoke
196+
Rake::Task["#{$root}/arch/csr/Zihpm/mhpmcounter#{hpm_num}h.yaml"].invoke
197+
Rake::Task["#{$root}/arch/csr/Zihpm/mhpmevent#{hpm_num}.yaml"].invoke
198+
Rake::Task["#{$root}/arch/csr/Zihpm/mhpmevent#{hpm_num}h.yaml"].invoke
199+
200+
Rake::Task["#{$root}/arch/csr/Zihpm/hpmcounter#{hpm_num}.yaml"].invoke
201+
Rake::Task["#{$root}/arch/csr/Zihpm/hpmcounter#{hpm_num}h.yaml"].invoke
202+
end
203+
204+
Rake::Task["#{$root}/arch/csr/I/mcounteren.yaml"].invoke
205+
Rake::Task["#{$root}/arch/csr/S/scounteren.yaml"].invoke
206+
Rake::Task["#{$root}/arch/csr/Zicntr/mcountinhibit.yaml"].invoke
207+
208+
(0..63).each do |pmpaddr_num|
209+
Rake::Task["#{$root}/arch/csr/I/pmpaddr#{pmpaddr_num}.yaml"].invoke
210+
end
211+
212+
(0..15).each do |pmpcfg_num|
213+
Rake::Task["#{$root}/arch/csr/I/pmpcfg#{pmpcfg_num}.yaml"].invoke
214+
end
215+
end
216+
end

0 commit comments

Comments
 (0)