Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ require "sorbet-runtime"
T.bind(self, T.all(Rake::DSL, Object))
extend T::Sig

require 'pathname'
require 'erb'

Encoding.default_external = "UTF-8"

$jobs = ENV["JOBS"].nil? ? 1 : ENV["JOBS"].to_i
Expand Down Expand Up @@ -360,6 +363,55 @@ file "#{$resolver.std_path}/csr/Zicntr/mcountinhibit.yaml" => [
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
end

# Define all acquire/release combinations
aq_rl_variants = [
{ suffix: "", aq: false, rl: false }, # base instruction
{ suffix: ".aq", aq: true, rl: false }, # acquire only
{ suffix: ".rl", aq: false, rl: true }, # release only
{ suffix: ".aqrl", aq: true, rl: true } # both acquire and release
]

# AMO instruction generation from layouts
%w[amoadd amoand amomax amomaxu amomin amominu amoor amoswap amoxor].each do |op|
["b", "h", "w", "d"].each do |size|
# Determine target extension directory based on size
extension_dir = %w[b h].include?(size) ? "Zabha" : "Zaamo"

aq_rl_variants.each do |variant|
file "#{$resolver.std_path}/inst/#{extension_dir}/#{op}.#{size}#{variant[:suffix]}.yaml" => [
"#{$resolver.std_path}/inst/Zaamo/#{op}.SIZE.AQRL.layout",
__FILE__
] do |t|
aq = variant[:aq]
rl = variant[:rl]
erb = ERB.new(File.read($resolver.std_path / "inst/Zaamo/#{op}.SIZE.AQRL.layout"), trim_mode: "-")
erb.filename = "#{$resolver.std_path}/inst/Zaamo/#{op}.SIZE.AQRL.layout"
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
end
end
end
end

# AMOCAS instruction generation from Zabha layout (supports both Zabha and Zacas)
# Zabha variants (b, h) -> generated in Zabha directory
["b", "h", "w", "d", "q" ].each do |size|
# Determine target extension directory based on size
extension_dir = %w[w d q].include?(size) ? "Zacas" : "Zabha"

aq_rl_variants.each do |variant|
file "#{$resolver.std_path}/inst/#{extension_dir}/amocas.#{size}#{variant[:suffix]}.yaml" => [
"#{$resolver.std_path}/inst/Zacas/amocas.SIZE.AQRL.layout",
__FILE__
] do |t|
aq = variant[:aq]
rl = variant[:rl]
erb = ERB.new(File.read($resolver.std_path / "inst/Zacas/amocas.SIZE.AQRL.layout"), trim_mode: "-")
erb.filename = "#{$resolver.std_path}/inst/Zacas/amocas.SIZE.AQRL.layout"
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
end
end
end

namespace :gen do
desc "Generate architecture files from layouts"
task :arch do
Expand All @@ -386,6 +438,26 @@ namespace :gen do
(0..15).each do |pmpcfg_num|
Rake::Task["#{$resolver.std_path}/csr/I/pmpcfg#{pmpcfg_num}.yaml"].invoke
end

# Generate AMO instruction files
%w[amoadd amoand amomax amomaxu amomin amominu amoor amoswap amoxor].each do |op|
["b", "h", "w", "d"].each do |size|
extension_dir = %w[b h].include?(size) ? "Zabha" : "Zaamo"
["", ".aq", ".rl", ".aqrl"].each do |suffix|
Rake::Task["#{$resolver.std_path}/inst/#{extension_dir}/#{op}.#{size}#{suffix}.yaml"].invoke
end
end
end

# Generate AMOCAS instruction files
["b", "h", "w", "d", "q"].each do |size|
["", ".aq", ".rl", ".aqrl"].each do |suffix|
# Determine target extension directory based on size
extension_dir = %w[w d q].include?(size) ? "Zacas" : "Zabha"

Rake::Task["#{$resolver.std_path}/inst/#{extension_dir}/amocas.#{size}#{suffix}.yaml"].invoke
end
end
end
end

Expand Down
Loading
Loading