@@ -5,6 +5,9 @@ require "sorbet-runtime"
55T . bind ( self , T . all ( Rake ::DSL , Object ) )
66extend T ::Sig
77
8+ require 'pathname'
9+ require 'erb'
10+
811Encoding . default_external = "UTF-8"
912
1013$jobs = ENV [ "JOBS" ] . nil? ? 1 : ENV [ "JOBS" ] . to_i
@@ -360,6 +363,55 @@ file "#{$resolver.std_path}/csr/Zicntr/mcountinhibit.yaml" => [
360363 File . write ( t . name , insert_warning ( erb . result ( binding ) , t . prerequisites . first ) )
361364end
362365
366+ # Define all acquire/release combinations
367+ aq_rl_variants = [
368+ { suffix : "" , aq : false , rl : false } , # base instruction
369+ { suffix : ".aq" , aq : true , rl : false } , # acquire only
370+ { suffix : ".rl" , aq : false , rl : true } , # release only
371+ { suffix : ".aqrl" , aq : true , rl : true } # both acquire and release
372+ ]
373+
374+ # AMO instruction generation from layouts
375+ %w[ amoadd amoand amomax amomaxu amomin amominu amoor amoswap amoxor ] . each do |op |
376+ [ "b" , "h" , "w" , "d" ] . each do |size |
377+ # Determine target extension directory based on size
378+ extension_dir = %w[ b h ] . include? ( size ) ? "Zabha" : "Zaamo"
379+
380+ aq_rl_variants . each do |variant |
381+ file "#{ $resolver. std_path } /inst/#{ extension_dir } /#{ op } .#{ size } #{ variant [ :suffix ] } .yaml" => [
382+ "#{ $resolver. std_path } /inst/Zaamo/#{ op } .SIZE.AQRL.layout" ,
383+ __FILE__
384+ ] do |t |
385+ aq = variant [ :aq ]
386+ rl = variant [ :rl ]
387+ erb = ERB . new ( File . read ( $resolver. std_path / "inst/Zaamo/#{ op } .SIZE.AQRL.layout" ) , trim_mode : "-" )
388+ erb . filename = "#{ $resolver. std_path } /inst/Zaamo/#{ op } .SIZE.AQRL.layout"
389+ File . write ( t . name , insert_warning ( erb . result ( binding ) , t . prerequisites . first ) )
390+ end
391+ end
392+ end
393+ end
394+
395+ # AMOCAS instruction generation from Zabha layout (supports both Zabha and Zacas)
396+ # Zabha variants (b, h) -> generated in Zabha directory
397+ [ "b" , "h" , "w" , "d" , "q" ] . each do |size |
398+ # Determine target extension directory based on size
399+ extension_dir = %w[ w d q ] . include? ( size ) ? "Zacas" : "Zabha"
400+
401+ aq_rl_variants . each do |variant |
402+ file "#{ $resolver. std_path } /inst/#{ extension_dir } /amocas.#{ size } #{ variant [ :suffix ] } .yaml" => [
403+ "#{ $resolver. std_path } /inst/Zacas/amocas.SIZE.AQRL.layout" ,
404+ __FILE__
405+ ] do |t |
406+ aq = variant [ :aq ]
407+ rl = variant [ :rl ]
408+ erb = ERB . new ( File . read ( $resolver. std_path / "inst/Zacas/amocas.SIZE.AQRL.layout" ) , trim_mode : "-" )
409+ erb . filename = "#{ $resolver. std_path } /inst/Zacas/amocas.SIZE.AQRL.layout"
410+ File . write ( t . name , insert_warning ( erb . result ( binding ) , t . prerequisites . first ) )
411+ end
412+ end
413+ end
414+
363415namespace :gen do
364416 desc "Generate architecture files from layouts"
365417 task :arch do
@@ -386,6 +438,26 @@ namespace :gen do
386438 ( 0 ..15 ) . each do |pmpcfg_num |
387439 Rake ::Task [ "#{ $resolver. std_path } /csr/I/pmpcfg#{ pmpcfg_num } .yaml" ] . invoke
388440 end
441+
442+ # Generate AMO instruction files
443+ %w[ amoadd amoand amomax amomaxu amomin amominu amoor amoswap amoxor ] . each do |op |
444+ [ "b" , "h" , "w" , "d" ] . each do |size |
445+ extension_dir = %w[ b h ] . include? ( size ) ? "Zabha" : "Zaamo"
446+ [ "" , ".aq" , ".rl" , ".aqrl" ] . each do |suffix |
447+ Rake ::Task [ "#{ $resolver. std_path } /inst/#{ extension_dir } /#{ op } .#{ size } #{ suffix } .yaml" ] . invoke
448+ end
449+ end
450+ end
451+
452+ # Generate AMOCAS instruction files
453+ [ "b" , "h" , "w" , "d" , "q" ] . each do |size |
454+ [ "" , ".aq" , ".rl" , ".aqrl" ] . each do |suffix |
455+ # Determine target extension directory based on size
456+ extension_dir = %w[ w d q ] . include? ( size ) ? "Zacas" : "Zabha"
457+
458+ Rake ::Task [ "#{ $resolver. std_path } /inst/#{ extension_dir } /amocas.#{ size } #{ suffix } .yaml" ] . invoke
459+ end
460+ end
389461 end
390462end
391463
0 commit comments