diff --git a/CMakeLists.txt b/CMakeLists.txt index c8d4133..7e03f6f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,8 +12,8 @@ if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) PROPERTY VALUE "${CMAKE_BINARY_DIR}/install") endif() -find_package(Ruby 3.4.8 EXACT REQUIRED) -find_package(Python3 3.12 EXACT REQUIRED COMPONENTS Interpreter) +find_package(Ruby 3.4.8 REQUIRED) +find_package(Python3 3.12 REQUIRED COMPONENTS Interpreter) message("Python found: ${Python3_EXECUTABLE}") include(ExternalProject) diff --git a/Gemfile b/Gemfile index 36f1616..be1058f 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ source "https://rubygems.org" -ruby "3.4.8" +ruby ">= 3.4.8" gem 'minitest', '~> 5.14' gem 'rspec', '~> 3.12' diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 4d58ff4..e7af9be 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,10 +1,29 @@ project(protea_irgen) +set(NATIVE_IR_FILE ${CMAKE_CURRENT_BINARY_DIR}/IR.yaml) + add_custom_command( - OUTPUT ${PROJECT_BINARY_DIR}/IR.yaml + OUTPUT ${NATIVE_IR_FILE} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ir_gen.rb + ${CMAKE_CURRENT_SOURCE_DIR}/ADL/base.rb + ${CMAKE_CURRENT_SOURCE_DIR}/ADL/builder.rb + ${CMAKE_CURRENT_SOURCE_DIR}/ADL/scope.rb + ${CMAKE_CURRENT_SOURCE_DIR}/ADL/var.rb + ${CMAKE_CURRENT_SOURCE_DIR}/ADL/value.rb + ${CMAKE_CURRENT_SOURCE_DIR}/Utility/type.rb + ${CMAKE_CURRENT_SOURCE_DIR}/Target/RISC-V/encoding.rb + ${CMAKE_CURRENT_SOURCE_DIR}/Target/RISC-V/32I.rb + ${CMAKE_CURRENT_SOURCE_DIR}/Target/RISC-V/32M.rb COMMAND ${BUNDLE_PATH} exec ruby ${CMAKE_CURRENT_SOURCE_DIR}/ir_gen.rb - COMMENT "Running ${PROJECT_NAME}" + --target ${CMAKE_CURRENT_SOURCE_DIR}/Target/RISC-V + --output ${NATIVE_IR_FILE} + COMMENT "Generating native IR (IR.yaml)" ) -add_custom_target(${PROJECT_NAME} DEPENDS ${PROJECT_BINARY_DIR}/IR.yaml) -install(FILES ${PROJECT_BINARY_DIR}/IR.yaml DESTINATION share/) + +add_custom_target(native_gen DEPENDS ${NATIVE_IR_FILE}) + +add_custom_target(protea_irgen DEPENDS native_gen) + +set(NATIVE_IR_FILE ${NATIVE_IR_FILE} PARENT_SCOPE) + +install(FILES ${NATIVE_IR_FILE} DESTINATION share/) diff --git a/lib/ir_gen.rb b/lib/ir_gen.rb index 1a66c17..e1f911e 100644 --- a/lib/ir_gen.rb +++ b/lib/ir_gen.rb @@ -1,10 +1,25 @@ #!/usr/bin/ruby # frozen_string_literal: true +require 'optparse' + require 'ADL/base' require 'ADL/builder' -require 'Target/RISC-V/32I' -require 'Target/RISC-V/32M' -yaml_data = SimInfra.serialize -File.write('IR.yaml', yaml_data) +options = { output: 'IR.yaml', target: nil } +OptionParser.new do |opts| + opts.banner = 'Usage: ir_gen.rb --target DIR --output FILE' + opts.on('-t', '--target PATH', 'Target directory or file to load') { |v| options[:target] = v } + opts.on('-o', '--output PATH', 'Output file (default: IR.yaml)') { |v| options[:output] = v } +end.parse! + +abort 'error: --target is required' if options[:target].nil? + +paths = if File.directory?(options[:target]) + Dir[File.join(options[:target], '*.rb')].sort + else + [options[:target]] + end +paths.each { |path| require File.expand_path(path) } + +File.write(options[:output], SimInfra.serialize)