feat: 🔥 oh god
This commit is contained in:
parent
cdb5492bfe
commit
3c7f48016d
30 changed files with 708 additions and 280 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -6,3 +6,4 @@
|
||||||
/pkg/
|
/pkg/
|
||||||
/spec/reports/
|
/spec/reports/
|
||||||
/tmp/
|
/tmp/
|
||||||
|
/build/
|
37
Gemfile.lock
37
Gemfile.lock
|
@ -10,51 +10,54 @@ GEM
|
||||||
backport (1.2.0)
|
backport (1.2.0)
|
||||||
benchmark (0.2.1)
|
benchmark (0.2.1)
|
||||||
coderay (1.1.3)
|
coderay (1.1.3)
|
||||||
debug (1.7.2)
|
debug (1.8.0)
|
||||||
irb (>= 1.5.0)
|
irb (>= 1.5.0)
|
||||||
reline (>= 0.3.1)
|
reline (>= 0.3.1)
|
||||||
diff-lcs (1.5.0)
|
diff-lcs (1.5.0)
|
||||||
e2mmap (0.1.0)
|
e2mmap (0.1.0)
|
||||||
io-console (0.6.0)
|
io-console (0.6.0)
|
||||||
irb (1.6.4)
|
irb (1.7.4)
|
||||||
reline (>= 0.3.0)
|
reline (>= 0.3.6)
|
||||||
jaro_winkler (1.5.4)
|
jaro_winkler (1.5.6)
|
||||||
json (2.6.3)
|
json (2.6.3)
|
||||||
kramdown (2.4.0)
|
kramdown (2.4.0)
|
||||||
rexml
|
rexml
|
||||||
kramdown-parser-gfm (1.1.0)
|
kramdown-parser-gfm (1.1.0)
|
||||||
kramdown (~> 2.0)
|
kramdown (~> 2.0)
|
||||||
|
language_server-protocol (3.17.0.3)
|
||||||
method_source (1.0.0)
|
method_source (1.0.0)
|
||||||
minitest (5.18.0)
|
minitest (5.18.1)
|
||||||
nokogiri (1.14.3-x86_64-linux)
|
nokogiri (1.15.3-x86_64-linux)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
parallel (1.22.1)
|
parallel (1.23.0)
|
||||||
parser (3.2.2.0)
|
parser (3.2.2.3)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
|
racc
|
||||||
pry (0.14.2)
|
pry (0.14.2)
|
||||||
coderay (~> 1.1)
|
coderay (~> 1.1)
|
||||||
method_source (~> 1.0)
|
method_source (~> 1.0)
|
||||||
racc (1.6.2)
|
racc (1.7.1)
|
||||||
rainbow (3.1.1)
|
rainbow (3.1.1)
|
||||||
rake (13.0.6)
|
rake (13.0.6)
|
||||||
rbs (2.8.4)
|
rbs (2.8.4)
|
||||||
regexp_parser (2.7.0)
|
regexp_parser (2.8.1)
|
||||||
reline (0.3.3)
|
reline (0.3.6)
|
||||||
io-console (~> 0.5)
|
io-console (~> 0.5)
|
||||||
reverse_markdown (2.1.1)
|
reverse_markdown (2.1.1)
|
||||||
nokogiri
|
nokogiri
|
||||||
rexml (3.2.5)
|
rexml (3.2.5)
|
||||||
rubocop (1.50.1)
|
rubocop (1.54.2)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
|
language_server-protocol (>= 3.17.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.2.0.0)
|
parser (>= 3.2.2.3)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.8, < 3.0)
|
regexp_parser (>= 1.8, < 3.0)
|
||||||
rexml (>= 3.2.5, < 4.0)
|
rexml (>= 3.2.5, < 4.0)
|
||||||
rubocop-ast (>= 1.28.0, < 2.0)
|
rubocop-ast (>= 1.28.0, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 2.4.0, < 3.0)
|
unicode-display_width (>= 2.4.0, < 3.0)
|
||||||
rubocop-ast (1.28.0)
|
rubocop-ast (1.29.0)
|
||||||
parser (>= 3.2.1.0)
|
parser (>= 3.2.1.0)
|
||||||
ruby-progressbar (1.13.0)
|
ruby-progressbar (1.13.0)
|
||||||
solargraph (0.49.0)
|
solargraph (0.49.0)
|
||||||
|
@ -73,10 +76,10 @@ GEM
|
||||||
thor (~> 1.0)
|
thor (~> 1.0)
|
||||||
tilt (~> 2.0)
|
tilt (~> 2.0)
|
||||||
yard (~> 0.9, >= 0.9.24)
|
yard (~> 0.9, >= 0.9.24)
|
||||||
thor (1.2.1)
|
thor (1.2.2)
|
||||||
tilt (2.1.0)
|
tilt (2.2.0)
|
||||||
unicode-display_width (2.4.2)
|
unicode-display_width (2.4.2)
|
||||||
yard (0.9.33)
|
yard (0.9.34)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
x86_64-linux
|
x86_64-linux
|
||||||
|
|
140
bin/console
140
bin/console
|
@ -12,138 +12,20 @@ $core = Comfpile::Core.new()
|
||||||
$core.add_artefact_engine Comfpile::FilesourceEngine, root_path: File.join(File.dirname(__FILE__), '../test/faux_build_dir')
|
$core.add_artefact_engine Comfpile::FilesourceEngine, root_path: File.join(File.dirname(__FILE__), '../test/faux_build_dir')
|
||||||
$core.add_artefact_engine Comfpile::ConfigLoaderEngine
|
$core.add_artefact_engine Comfpile::ConfigLoaderEngine
|
||||||
|
|
||||||
$core.add_artefact_engine Comfpile::ParserEngine,
|
require_relative 'ghdl_engine.rb'
|
||||||
file_regex: /^(.+)\.(h|c|cpp)$/,
|
require_relative 'cpp_engine.rb'
|
||||||
search_regexes: [
|
|
||||||
{
|
|
||||||
regex: /^#include\s*[<"](?<value>.+)[>"]/,
|
|
||||||
key: 'include'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
regex: /\/\/\s*comf\.(?<key>\w+)[=:]\s*(?<value>.+)/
|
|
||||||
}
|
|
||||||
]
|
|
||||||
$core.add_artefact_engine Comfpile::ParserEngine,
|
|
||||||
file_regex: /^(.+)\.vhd$/,
|
|
||||||
search_regexes: [
|
|
||||||
{
|
|
||||||
regex: /--+\s*comf\.(?<key>[^:]+)[=:]\s*(?<value>.+)/
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
$core.add_artefact_engine do |engine|
|
t_start = Time.now()
|
||||||
engine.add_recipe(:ghdl_analysed, /^(.+)\.vhd/) do |match, a|
|
dep_art = $core.craft_and_complete(:execute, "cpp/main.cpp")
|
||||||
a.parent_artefact :dependency_analysis_include, a.target
|
dep_art = $core.craft_and_complete(:execute, "cpp/main2.cpp")
|
||||||
|
t_end = Time.now()
|
||||||
|
|
||||||
a.add_step do
|
# t_start = Time.now()
|
||||||
@parent_artefact.dependencies.each do |dependency|
|
# dep_art = $core.craft_and_complete(:gtkwave_output, "vhdl/spi_master_tb.vhd")
|
||||||
next if dependency.target == a.target
|
# t_end = Time.now()
|
||||||
|
|
||||||
log "Adding dependency for ghdl analysis of #{dependency.target}..."
|
# puts "Full dependency list is: #{dep_art.dependencies.map(&:target)} (took #{t_end - t_start})"
|
||||||
|
# puts "Includes of all source files:"
|
||||||
require_artefact :ghdl_analysed, dependency.target
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
a.add_step do
|
|
||||||
work_library = find_parsed_parameter('vhdl.work')
|
|
||||||
if work_library.nil?
|
|
||||||
work_library = ''
|
|
||||||
else
|
|
||||||
work_library = '--work=' + work_library
|
|
||||||
end
|
|
||||||
|
|
||||||
cmd = "ghdl -a -fsynopsys --std=08 #{work_library} #{self.file}"
|
|
||||||
log "Executing: #{cmd}"
|
|
||||||
|
|
||||||
`#{cmd}`
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
engine.add_recipe(:ghdl_elaborated, /^(.+)\.vhd/) do |match, a|
|
|
||||||
a.parent_artefact :dependency_analysis, a.target
|
|
||||||
|
|
||||||
a.add_step do
|
|
||||||
dependencies.each do |dep|
|
|
||||||
require_artefact :ghdl_analysed, dep.target
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
a.add_step do
|
|
||||||
work_library = find_parsed_parameter('vhdl.work')
|
|
||||||
if work_library.nil?
|
|
||||||
work_library = ''
|
|
||||||
else
|
|
||||||
work_library = '--work=' + work_library
|
|
||||||
end
|
|
||||||
|
|
||||||
elaborate_arch = find_parsed_parameter('vhdl.elaborate') || File.basename(@target).chomp(File.extname(@target))
|
|
||||||
|
|
||||||
cmd = "ghdl -e -fsynopsys --std=08 #{work_library} #{elaborate_arch}"
|
|
||||||
log "Executing: #{cmd}"
|
|
||||||
|
|
||||||
`#{cmd}`
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
engine.add_recipe :ghdl_run, /^(.+)\.vhd/ do |match, a|
|
|
||||||
a.parent_artefact :ghdl_elaborated, a.target
|
|
||||||
|
|
||||||
a.add_step do
|
|
||||||
work_library = find_parsed_parameter('vhdl.work')
|
|
||||||
if work_library.nil?
|
|
||||||
work_library = ''
|
|
||||||
else
|
|
||||||
work_library = '--work=' + work_library
|
|
||||||
end
|
|
||||||
|
|
||||||
elaborate_arch = find_parsed_parameter('vhdl.elaborate') || File.basename(@target).chomp(File.extname(@target))
|
|
||||||
|
|
||||||
@parameters[:ghdl_arch] = elaborate_arch
|
|
||||||
|
|
||||||
cmd = "ghdl -r -fsynopsys --std=08 #{work_library} #{elaborate_arch} --wave=#{elaborate_arch}.ghw"
|
|
||||||
log "Executing: #{cmd}"
|
|
||||||
|
|
||||||
`#{cmd}`
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
engine.add_recipe(:gtkwave_output, /^(.+)\.vhd/) do |match, a|
|
|
||||||
a.parent_artefact :ghdl_run, a.target
|
|
||||||
a.add_step do
|
|
||||||
`gtkwave #{@parent_artefact[:ghdl_arch]}.ghw`
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
$core.add_artefact_engine do |engine|
|
|
||||||
|
|
||||||
engine.add_recipe(:dependency_list, /^(.+)\.(h|c|cpp)$/) do |match, a|
|
|
||||||
|
|
||||||
a.require_artefact :dependency_analysis, a.target
|
|
||||||
a.require_artefact :dependency_analysis_include, a.target
|
|
||||||
|
|
||||||
a.add_step do
|
|
||||||
deps_artefact = find_artefact(:dependency_analysis, @target)
|
|
||||||
@parameters[:dependency_list] = deps_artefact.dependencies
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
engine.add_recipe(:x86_debug, /^run (.+)/) do |match, a|
|
|
||||||
|
|
||||||
a.require_artefact :parsed, "#{match[1]}.cpp"
|
|
||||||
end
|
|
||||||
|
|
||||||
engine.add_recipe(:x86_debug, /(.+)\.o$/) do |match, a|
|
|
||||||
a.require_artefact :sourcefile, "#{match[1]}.cpp"
|
|
||||||
|
|
||||||
a.add_step do
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# (If you use this, don't forget to add pry to your Gemfile!)
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
||||||
require "pry"
|
require "pry"
|
||||||
|
|
48
bin/cpp-engine_old.rb
Normal file
48
bin/cpp-engine_old.rb
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
|
||||||
|
|
||||||
|
$core.add_artefact_engine Comfpile::ParserEngine,
|
||||||
|
file_regex: /^(.+)\.(h|c|cpp)$/,
|
||||||
|
search_regexes: [
|
||||||
|
{
|
||||||
|
regex: /^#include\s*[<"](?<value>.+)[>"]/,
|
||||||
|
key: 'include'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
regex: /\/\/\s*comf\.(?<key>\w+)[=:]\s*(?<value>.+)/
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
$core.add_artefact_engine do |engine|
|
||||||
|
|
||||||
|
engine.add_recipe(:dependency_list, /^(.+)\.(h|c|cpp)$/) do |match, a|
|
||||||
|
|
||||||
|
a.require_artefact :dependency_analysis, a.target
|
||||||
|
a.require_artefact :dependency_analysis_include, a.target
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
deps_artefact = find_artefact(:dependency_analysis, @target)
|
||||||
|
@parameters[:dependency_list] = deps_artefact.dependencies
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
engine.add_recipe(:x86_debug, /^run (.+)/) do |match, a|
|
||||||
|
|
||||||
|
a.require_artefact :parsed, "#{match[1]}.cpp"
|
||||||
|
end
|
||||||
|
|
||||||
|
engine.add_recipe(:x86_debug, /(.+)\.o$/) do |match, a|
|
||||||
|
a.require_artefact :sourcefile, "#{match[1]}.cpp"
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
engine.add_recipe(:execute, /(.*)/) do |match, a|
|
||||||
|
a.parent_artefact :executable, match[0]
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
@parent_artefact
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
70
bin/cpp_engine.rb
Normal file
70
bin/cpp_engine.rb
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
|
||||||
|
|
||||||
|
$core.add_artefact_engine Comfpile::ParserEngine,
|
||||||
|
file_regex: /^(.+)\.(h|c|cpp)$/,
|
||||||
|
search_regexes: [
|
||||||
|
{
|
||||||
|
regex: /^#include\s*[<"](?<value>.+)[>"]/,
|
||||||
|
key: 'include'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
regex: /\/\/\s*comf\.(?<key>\w+)[=:]?\s*(?<value>.+)/
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
$core.add_artefact_engine do |engine|
|
||||||
|
engine.add_recipe(:object, /^(.*)\.(h|c|cpp)$/) do |match, a|
|
||||||
|
a.parent_artefact :sourcefile, match[0]
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
`g++ -I #{@build_dir} -c #{@target} -o #{@target}.o`
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
engine.add_recipe(:main_object, /^(.*)\.(h|c|cpp)$/) do |match, a|
|
||||||
|
a.parent_artefact :sourcefile, match[0]
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
`g++ -DCOMF_MAIN -I #{@build_dir} -c #{@target} -o #{@target}.main.o`
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
engine.add_recipe(:executable) do |match, a|
|
||||||
|
a.parent_artefact :dependency_analysis, match
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
@object_files = []
|
||||||
|
|
||||||
|
@parent_artefact.dependencies.each do |dep|
|
||||||
|
next unless ['.c', '.cpp'].include? File.extname(dep.target)
|
||||||
|
next if dep.target == @target
|
||||||
|
|
||||||
|
@object_files << require_artefact(:object, dep.target)
|
||||||
|
end
|
||||||
|
|
||||||
|
@main_object_file = require_artefact(:main_object, @target)
|
||||||
|
end
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
link_objects = []
|
||||||
|
@object_files.each do |obj|
|
||||||
|
link_objects << obj.target + '.o'
|
||||||
|
end
|
||||||
|
link_objects << @main_object_file.target + '.main.o'
|
||||||
|
|
||||||
|
cmd = "g++ #{link_objects.join(' ')} -o #{@target.sub(/\.[^.\/]*\Z/, '')}"
|
||||||
|
log cmd
|
||||||
|
|
||||||
|
`#{cmd}`
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
engine.add_recipe(:execute) do |match, a|
|
||||||
|
|
||||||
|
a.parent_artefact :executable, match
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
print `./#{@target.sub(/\.[^.\/]*\Z/, '')}`
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
94
bin/ghdl_engine.rb
Normal file
94
bin/ghdl_engine.rb
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
|
||||||
|
|
||||||
|
$core.add_artefact_engine Comfpile::ParserEngine,
|
||||||
|
file_regex: /^(.+)\.vhd$/,
|
||||||
|
search_regexes: [
|
||||||
|
{
|
||||||
|
regex: /--+\s*comf\.(?<key>[^:]+)[=:]\s*(?<value>.+)/
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
$core.add_artefact_engine do |engine|
|
||||||
|
engine.add_recipe(:ghdl_analysed, /^(.+)\.vhd/) do |match, a|
|
||||||
|
a.parent_artefact :dependency_analysis_include, a.target
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
@parent_artefact.dependencies.each do |dependency|
|
||||||
|
next if dependency.target == a.target
|
||||||
|
|
||||||
|
log "Adding dependency for ghdl analysis of #{dependency.target}..."
|
||||||
|
|
||||||
|
require_artefact :ghdl_analysed, dependency.target
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
work_library = find_parsed_parameter('vhdl.work')
|
||||||
|
if work_library.nil?
|
||||||
|
work_library = ''
|
||||||
|
else
|
||||||
|
work_library = '--work=' + work_library
|
||||||
|
end
|
||||||
|
|
||||||
|
cmd = "ghdl -a -fsynopsys --std=08 #{work_library} #{self.file}"
|
||||||
|
log "Executing: #{cmd}"
|
||||||
|
|
||||||
|
`#{cmd}`
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
engine.add_recipe(:ghdl_elaborated, /^(.+)\.vhd/) do |match, a|
|
||||||
|
a.parent_artefact :dependency_analysis, a.target
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
dependencies.each do |dep|
|
||||||
|
require_artefact :ghdl_analysed, dep.target
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
work_library = find_parsed_parameter('vhdl.work')
|
||||||
|
if work_library.nil?
|
||||||
|
work_library = ''
|
||||||
|
else
|
||||||
|
work_library = '--work=' + work_library
|
||||||
|
end
|
||||||
|
|
||||||
|
elaborate_arch = find_parsed_parameter('vhdl.elaborate') || File.basename(@target).chomp(File.extname(@target))
|
||||||
|
|
||||||
|
cmd = "ghdl -e -fsynopsys --std=08 #{work_library} #{elaborate_arch}"
|
||||||
|
log "Executing: #{cmd}"
|
||||||
|
|
||||||
|
`#{cmd}`
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
engine.add_recipe :ghdl_run, /^(.+)\.vhd/ do |match, a|
|
||||||
|
a.parent_artefact :ghdl_elaborated, a.target
|
||||||
|
|
||||||
|
a.add_step do
|
||||||
|
work_library = find_parsed_parameter('vhdl.work')
|
||||||
|
if work_library.nil?
|
||||||
|
work_library = ''
|
||||||
|
else
|
||||||
|
work_library = '--work=' + work_library
|
||||||
|
end
|
||||||
|
|
||||||
|
elaborate_arch = find_parsed_parameter('vhdl.elaborate') || File.basename(@target).chomp(File.extname(@target))
|
||||||
|
|
||||||
|
@parameters[:ghdl_arch] = elaborate_arch
|
||||||
|
|
||||||
|
cmd = "ghdl -r -fsynopsys --std=08 #{work_library} #{elaborate_arch} --wave=#{elaborate_arch}.ghw"
|
||||||
|
log "Executing: #{cmd}"
|
||||||
|
|
||||||
|
`#{cmd}`
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
engine.add_recipe(:gtkwave_output, /^(.+)\.vhd/) do |match, a|
|
||||||
|
a.parent_artefact :ghdl_run, a.target
|
||||||
|
a.add_step do
|
||||||
|
`gtkwave #{@parent_artefact[:ghdl_arch]}.ghw`
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -4,5 +4,9 @@
|
||||||
"path": "."
|
"path": "."
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"settings": {}
|
"settings": {
|
||||||
|
"conventionalCommits.scopes": [
|
||||||
|
"context"
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -6,4 +6,6 @@ require_relative 'comfpile/core.rb'
|
||||||
|
|
||||||
require_relative 'comfpile/engines/filesource_engine.rb'
|
require_relative 'comfpile/engines/filesource_engine.rb'
|
||||||
require_relative 'comfpile/engines/parser_engine.rb'
|
require_relative 'comfpile/engines/parser_engine.rb'
|
||||||
require_relative 'comfpile/engines/config_engine.rb'
|
require_relative 'comfpile/engines/config_engine.rb'
|
||||||
|
|
||||||
|
require_relative 'comfpile/context.rb'
|
|
@ -8,6 +8,9 @@ module Comfpile
|
||||||
class Artefact
|
class Artefact
|
||||||
attr_reader :core, :engine
|
attr_reader :core, :engine
|
||||||
|
|
||||||
|
# @return [Comfpile::ContextKey] The context key of this artefact
|
||||||
|
attr_reader :context
|
||||||
|
|
||||||
attr_reader :exit_state
|
attr_reader :exit_state
|
||||||
attr_reader :stage, :target
|
attr_reader :stage, :target
|
||||||
|
|
||||||
|
@ -32,6 +35,8 @@ module Comfpile
|
||||||
# linking steps, but the objects can be built separately.
|
# linking steps, but the objects can be built separately.
|
||||||
attr_reader :referenced_artefacts
|
attr_reader :referenced_artefacts
|
||||||
|
|
||||||
|
attr_reader :build_dir
|
||||||
|
|
||||||
# ARTEFACT STATES
|
# ARTEFACT STATES
|
||||||
#
|
#
|
||||||
# The following states are known to the system:
|
# The following states are known to the system:
|
||||||
|
@ -55,7 +60,7 @@ module Comfpile
|
||||||
|
|
||||||
@stage = stage
|
@stage = stage
|
||||||
@target = target
|
@target = target
|
||||||
@context = @core.sanitize_context context
|
@context = @core.get_context_key context
|
||||||
|
|
||||||
@parent_artefact = nil
|
@parent_artefact = nil
|
||||||
|
|
||||||
|
@ -76,6 +81,8 @@ module Comfpile
|
||||||
|
|
||||||
@exit_state = nil
|
@exit_state = nil
|
||||||
@running = false
|
@running = false
|
||||||
|
|
||||||
|
@build_dir = opts[:build_dir] || @core.get_context_build_dir_path(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def [](key)
|
def [](key)
|
||||||
|
@ -109,7 +116,7 @@ module Comfpile
|
||||||
@log_current_line = text
|
@log_current_line = text
|
||||||
@log_current_level = level
|
@log_current_level = level
|
||||||
|
|
||||||
puts "> %-30s %s:\n %s" % [@stage, @target, text]
|
print "\033[2K> %-30s %s: %s\r" % [@stage, @target, text]
|
||||||
|
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,7 +16,7 @@ module Comfpile
|
||||||
end
|
end
|
||||||
|
|
||||||
def craft(stage, target, context)
|
def craft(stage, target, context)
|
||||||
context = @core.sanitize_context context
|
context = @core.get_context_key context
|
||||||
|
|
||||||
@recipes.each do |recipe|
|
@recipes.each do |recipe|
|
||||||
match = target
|
match = target
|
||||||
|
@ -25,10 +25,10 @@ module Comfpile
|
||||||
next unless stage == recipe[:stage]
|
next unless stage == recipe[:stage]
|
||||||
end
|
end
|
||||||
|
|
||||||
if r = recipe[:regex]
|
if not (r = recipe[:regex]).nil?
|
||||||
if r.is_a? String
|
if r.is_a? String
|
||||||
next unless target == r
|
next unless target == r
|
||||||
else
|
elsif r.is_a? Regexp
|
||||||
match = r.match target
|
match = r.match target
|
||||||
next if match.nil?
|
next if match.nil?
|
||||||
end
|
end
|
||||||
|
@ -51,7 +51,7 @@ module Comfpile
|
||||||
other.subpriority <=> self.subpriority
|
other.subpriority <=> self.subpriority
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_recipe(stage = nil, target_regex, &block)
|
def add_recipe(stage, target_regex = nil, &block)
|
||||||
@recipes << {
|
@recipes << {
|
||||||
regex: target_regex,
|
regex: target_regex,
|
||||||
stage: stage,
|
stage: stage,
|
||||||
|
|
|
@ -53,17 +53,7 @@ module Comfpile
|
||||||
tags.empty?
|
tags.empty?
|
||||||
end
|
end
|
||||||
|
|
||||||
def hash
|
|
||||||
@tag.hash
|
|
||||||
end
|
|
||||||
|
|
||||||
def eql?(other)
|
|
||||||
if(other.is_a? Symbol)
|
|
||||||
@tag.eql? other
|
|
||||||
elsif(other.is_a? ContextTag)
|
|
||||||
@tag.eql? other.tag
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -119,78 +109,88 @@ module Comfpile
|
||||||
raise ArgumentError, "Attempted to set child-parameter of another parameter!"
|
raise ArgumentError, "Attempted to set child-parameter of another parameter!"
|
||||||
end
|
end
|
||||||
|
|
||||||
current_hash[key[-1]] = value
|
return @provider.provide_context(new_keys)
|
||||||
|
|
||||||
value
|
|
||||||
end
|
|
||||||
alias set []=
|
|
||||||
|
|
||||||
def set_flag(key, value)
|
|
||||||
set resolve_key(key).append(value), true
|
|
||||||
end
|
|
||||||
def get_flags(key)
|
|
||||||
(@config_options&.dig(*resolve_key(key)) || {}).keys
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def dig(arg0, *args)
|
def to_s
|
||||||
@config_options&.dig(arg0, *args)
|
"CTX[" + @context_symbol.to_s + "]"
|
||||||
end
|
|
||||||
|
|
||||||
def append(key, value)
|
|
||||||
key = resolve_key key
|
|
||||||
array = @config_options&.dig(*key)
|
|
||||||
|
|
||||||
if array.nil?
|
|
||||||
array = set key, []
|
|
||||||
end
|
|
||||||
|
|
||||||
raise ArgumentError, "Attempted to append to a non-list parameter!" unless array.is_a? Array
|
|
||||||
|
|
||||||
array << value
|
|
||||||
end
|
|
||||||
alias append_to append
|
|
||||||
|
|
||||||
def assert(orig_key, value)
|
|
||||||
key = resolve_key orig_key
|
|
||||||
current_value = @config_options&.dig(*key)
|
|
||||||
|
|
||||||
if current_value.nil?
|
|
||||||
set key, value
|
|
||||||
elsif current_value != value
|
|
||||||
raise ArgumentError, "Config key assertion failed! #{orig_key} should be #{value}, is #{current_value}!"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def build_config
|
|
||||||
@config_options = nil
|
|
||||||
|
|
||||||
@seeder_blocks.sort { |block| block[:priority] }.each do |block|
|
|
||||||
self.instance_exec(block, &block[:block])
|
|
||||||
end
|
|
||||||
|
|
||||||
self.freeze
|
|
||||||
end
|
end
|
||||||
|
alias inspect to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
class ContextConfigContainer
|
class ContextKeyProvider
|
||||||
def initialize
|
def initialize
|
||||||
@context_configs_seeds = []
|
@known_context_keys = Hash.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_seeds_for(context_tag)
|
def symbol_to_keys(symbol)
|
||||||
out = []
|
raise ArgumentError, 'Input symbol needs to be a Symbol!' unless symbol.is_a? Symbol
|
||||||
|
|
||||||
@context_configs_seeds.each do |seed|
|
out_keys = Hash.new
|
||||||
seed_tags = seed[:context_tags]
|
|
||||||
|
|
||||||
seed_tags.each do |tag|
|
|
||||||
|
|
||||||
|
symbol.to_s.split(';').each do |key|
|
||||||
|
if key =~ /(?<key>[^=]+)=(?<value>[^=]+)/
|
||||||
|
out_keys[$~['key'].to_sym] = $~['value'].to_s
|
||||||
|
else
|
||||||
|
out_keys[key.to_sym] = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
out_keys
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_to_config(context_config)
|
def sanitize_keys(keys)
|
||||||
raise ArgumentError, "No context supplied!" unless context_config.is_a? ContextConfig
|
out_keys = Hash.new
|
||||||
|
|
||||||
|
keys.each do |key, value|
|
||||||
|
if value.is_a? TrueClass
|
||||||
|
out_keys[key.to_sym] = true
|
||||||
|
elsif (not value.nil?) and (not value.is_a? FalseClass)
|
||||||
|
out_keys[key.to_sym] = value.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
out_keys
|
||||||
|
end
|
||||||
|
|
||||||
|
def keys_to_symbol(keys)
|
||||||
|
raise ArgumentError, 'Keys needs to be a Hash!' unless keys.is_a? Hash
|
||||||
|
|
||||||
|
keys.keys.sort.map do |key|
|
||||||
|
value = keys[key]
|
||||||
|
|
||||||
|
if value.is_a? TrueClass
|
||||||
|
key.to_s
|
||||||
|
elsif value.is_a? FalseClass
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
"#{key}=#{value}"
|
||||||
|
end
|
||||||
|
end.compact.join(';').to_sym
|
||||||
|
end
|
||||||
|
|
||||||
|
def provide_context(ctx)
|
||||||
|
return ctx if ctx.is_a? ContextKey
|
||||||
|
|
||||||
|
orig_ctx = ctx
|
||||||
|
|
||||||
|
return @known_context_keys[ctx] if @known_context_keys.include? ctx
|
||||||
|
|
||||||
|
ctx = symbol_to_keys(ctx) if ctx.is_a? Symbol
|
||||||
|
ctx = sanitize_keys(ctx)
|
||||||
|
|
||||||
|
ctx_symbol = keys_to_symbol(ctx)
|
||||||
|
|
||||||
|
if @known_context_keys.include? ctx
|
||||||
|
existing_ctx = @known_context_keys[ctx]
|
||||||
|
@known_context_keys[orig_ctx] = existing_ctx
|
||||||
|
return existing_ctx
|
||||||
|
end
|
||||||
|
|
||||||
|
new_ctx = ContextKey.new(self, ctx, ctx_symbol)
|
||||||
|
|
||||||
|
@known_context_keys[ctx] = new_ctx
|
||||||
|
@known_context_keys[ctx_symbol] = new_ctx
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
|
@ -1,4 +1,6 @@
|
||||||
|
|
||||||
|
require 'digest'
|
||||||
|
|
||||||
require_relative 'artefact_engine.rb'
|
require_relative 'artefact_engine.rb'
|
||||||
|
|
||||||
require_relative 'context.rb'
|
require_relative 'context.rb'
|
||||||
|
@ -7,7 +9,9 @@ module Comfpile
|
||||||
class Core
|
class Core
|
||||||
attr_reader :processing_stack
|
attr_reader :processing_stack
|
||||||
|
|
||||||
def initialize()
|
def initialize(build_dir_path: File.join('/tmp/comfpile/', Digest::MD5.hexdigest(Dir.pwd)))
|
||||||
|
@build_dir_path = File.expand_path(build_dir_path)
|
||||||
|
|
||||||
@artefact_engines = []
|
@artefact_engines = []
|
||||||
@artefact_prio_counter = 0
|
@artefact_prio_counter = 0
|
||||||
|
|
||||||
|
@ -15,44 +19,18 @@ module Comfpile
|
||||||
# First query is stage, second filename.
|
# First query is stage, second filename.
|
||||||
@artefacts = {}
|
@artefacts = {}
|
||||||
|
|
||||||
@valid_contexts = {}
|
|
||||||
|
|
||||||
# Stack-style processing queue for item processing
|
# Stack-style processing queue for item processing
|
||||||
@processing_stack = []
|
@processing_stack = []
|
||||||
|
|
||||||
|
@context_key_provider = ContextKeyProvider.new()
|
||||||
end
|
end
|
||||||
|
|
||||||
# Sanitize and unify context tags.
|
def get_context_key(key)
|
||||||
# This function will take either an array of tags, or a symbol,
|
return @context_key_provider.provide_context(key)
|
||||||
# and sanitize and unify it to match a predictable context tag
|
|
||||||
# format.
|
|
||||||
#
|
|
||||||
# Context tags are symbols containing a list of unique configs
|
|
||||||
# types to use, separated by underscore ('_')
|
|
||||||
#
|
|
||||||
# @param [Array<Symbol,String>, Symbol] context The context to
|
|
||||||
# sanitize
|
|
||||||
#
|
|
||||||
# @return [Symbol] Sanitized context. Unique, sorted list
|
|
||||||
# of tags, joined into a Symbol.
|
|
||||||
#
|
|
||||||
def sanitize_context(context)
|
|
||||||
if context.nil?
|
|
||||||
return :default
|
|
||||||
elsif context.is_a? Array
|
|
||||||
new_context = context.uniq.sort.join('_').to_sym
|
|
||||||
@valid_contexts[new_context] = true
|
|
||||||
|
|
||||||
return new_context
|
|
||||||
elsif context.is_a? Symbol
|
|
||||||
return context if @valid_contexts[context]
|
|
||||||
return sanitize_context(context.to_s.split('_'))
|
|
||||||
else
|
|
||||||
raise ArgumentError, "Unknown context key type supplied!"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_artefact(stage, file = :none, context = :default)
|
def find_artefact(stage, file = :none, context = :default)
|
||||||
context = sanitize_context(context)
|
context = get_context_key(context)
|
||||||
|
|
||||||
@artefacts.dig(context, stage, file)
|
@artefacts.dig(context, stage, file)
|
||||||
end
|
end
|
||||||
|
@ -73,7 +51,7 @@ module Comfpile
|
||||||
# @return [Comfpile::Artefact, nil] Found or created artefact, or nil if nothing could be done
|
# @return [Comfpile::Artefact, nil] Found or created artefact, or nil if nothing could be done
|
||||||
#
|
#
|
||||||
def craft_artefact(stage, file = :none, context = :default)
|
def craft_artefact(stage, file = :none, context = :default)
|
||||||
context = sanitize_context(context)
|
context = get_context_key(context)
|
||||||
|
|
||||||
artefact = find_artefact(stage, file, context)
|
artefact = find_artefact(stage, file, context)
|
||||||
|
|
||||||
|
@ -97,7 +75,7 @@ module Comfpile
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_artefact(stage, file = :none, context = :default, engine: nil, artefact_class: Comfpile::Artefact)
|
def add_artefact(stage, file = :none, context = :default, engine: nil, artefact_class: Comfpile::Artefact)
|
||||||
context = sanitize_context context
|
context = get_context_key context
|
||||||
|
|
||||||
return unless find_artefact(stage, file, context).nil?
|
return unless find_artefact(stage, file, context).nil?
|
||||||
|
|
||||||
|
@ -165,6 +143,12 @@ module Comfpile
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_context_build_dir_path(context)
|
||||||
|
context = context.context if context.is_a? Artefact
|
||||||
|
|
||||||
|
File.expand_path(File.join(@build_dir_path, context.to_s))
|
||||||
|
end
|
||||||
|
|
||||||
def execute_step
|
def execute_step
|
||||||
return if @processing_stack.empty?
|
return if @processing_stack.empty?
|
||||||
# puts "Got #{@processing_stack.length} items..."
|
# puts "Got #{@processing_stack.length} items..."
|
||||||
|
@ -177,9 +161,14 @@ module Comfpile
|
||||||
|
|
||||||
# puts "Processing artefact #{artefact.stage} #{artefact.target}"
|
# puts "Processing artefact #{artefact.stage} #{artefact.target}"
|
||||||
|
|
||||||
begin
|
build_path = get_context_build_dir_path(artefact)
|
||||||
artefact.execute_step
|
FileUtils.mkpath build_path
|
||||||
rescue ArtefactExecSkipError
|
|
||||||
|
Dir.chdir build_path do
|
||||||
|
begin
|
||||||
|
artefact.execute_step
|
||||||
|
rescue ArtefactExecSkipError
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
nil
|
nil
|
||||||
|
|
|
@ -25,7 +25,9 @@ module Comfpile
|
||||||
end
|
end
|
||||||
|
|
||||||
@config_file_artefact = craft_artefact(:sourcefile, File.join(@target, "comf.yml"))
|
@config_file_artefact = craft_artefact(:sourcefile, File.join(@target, "comf.yml"))
|
||||||
wait_on @config_file_artefact
|
return if @config_file_artefact.nil?
|
||||||
|
|
||||||
|
wait_on @config_file_artefact
|
||||||
|
|
||||||
add_step do
|
add_step do
|
||||||
unless @config_file_artefact.nil?
|
unless @config_file_artefact.nil?
|
||||||
|
|
|
@ -6,18 +6,23 @@ module Comfpile
|
||||||
alias path filename
|
alias path filename
|
||||||
alias file filename
|
alias file filename
|
||||||
|
|
||||||
def initialize(*args, file: filename, **opts)
|
def initialize(*args, file: nil, **opts)
|
||||||
super(*args, **opts)
|
super(*args, **opts)
|
||||||
|
|
||||||
@filename = file
|
@original_filename = file
|
||||||
|
|
||||||
unless File.exist? @filename
|
unless File.exist? @original_filename
|
||||||
fail! "File could not be loaded!"
|
fail! "File could not be loaded!"
|
||||||
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO add actual file reading/copying to build dir
|
@filename = @target
|
||||||
|
|
||||||
|
add_step do
|
||||||
|
FileUtils.mkpath File.dirname(@filename)
|
||||||
|
FileUtils.cp @original_filename, @filename
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def mtime
|
def mtime
|
||||||
|
@ -35,7 +40,7 @@ module Comfpile
|
||||||
def craft(stage, target, context)
|
def craft(stage, target, context)
|
||||||
return nil unless stage == :sourcefile
|
return nil unless stage == :sourcefile
|
||||||
|
|
||||||
full_path = File.join(@root_path, target)
|
full_path = File.expand_path(File.join(@root_path, target))
|
||||||
|
|
||||||
return nil unless File.exists? full_path
|
return nil unless File.exists? full_path
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ module Comfpile
|
||||||
end
|
end
|
||||||
|
|
||||||
def sourcefile_dependency_step
|
def sourcefile_dependency_step
|
||||||
['include', 'require', 'reference'].map do |key|
|
['include', 'require', 'reference'].each do |key|
|
||||||
key_artefacts = resolve_sourcefile(find_parsed_parameters(key), optional: key == 'include')
|
key_artefacts = resolve_sourcefile(find_parsed_parameters(key), optional: key == 'include')
|
||||||
|
|
||||||
@parsed_dependencies[key] = key_artefacts.map { |key| craft_artefact(:parsed, key) }
|
@parsed_dependencies[key] = key_artefacts.map { |key| craft_artefact(:parsed, key) }
|
||||||
|
|
171
lib/comfpile/old_context.rb
Normal file
171
lib/comfpile/old_context.rb
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
|
||||||
|
|
||||||
|
module Comfpile
|
||||||
|
class ContextTag
|
||||||
|
def initialize(tag)
|
||||||
|
@@known_tags ||= {}
|
||||||
|
|
||||||
|
case tag
|
||||||
|
when Symbol, String
|
||||||
|
precompiled = @@known_tags[tag.to_sym]
|
||||||
|
|
||||||
|
if not precompiled.nil?
|
||||||
|
@tag = precompiled[:tag]
|
||||||
|
@tag_array = precompiled[:array]
|
||||||
|
else
|
||||||
|
@tag_array = tag.to_s.split('_').uniq.sort
|
||||||
|
|
||||||
|
end
|
||||||
|
when Array
|
||||||
|
@tag_array = tag.map(&:to_s).uniq.sort
|
||||||
|
@tag = @tag_array
|
||||||
|
end
|
||||||
|
|
||||||
|
@tag ||= @tag_array.join('_').to_sym
|
||||||
|
|
||||||
|
tag_data = {
|
||||||
|
tag: @tag,
|
||||||
|
array: @ŧag_array
|
||||||
|
}
|
||||||
|
|
||||||
|
@@known_tags[@tag] ||= tag_data
|
||||||
|
@@known_tags[tag] ||= tag_data
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def self.tagify(tag)
|
||||||
|
@known_tags ||= {}
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# This class represents the configuration of a specific context.
|
||||||
|
# It has two main jobs:
|
||||||
|
# To provide functions to set up and merge configuration options
|
||||||
|
# from the various tags given to it, and
|
||||||
|
# to give reader options for the various config options.
|
||||||
|
#
|
||||||
|
# Most importantly, it contains mechanisms for safely setting up
|
||||||
|
# configurations and flagging issues.
|
||||||
|
#
|
||||||
|
class ContextConfig
|
||||||
|
attr_reader :context_tag
|
||||||
|
|
||||||
|
attr_reader :config_options
|
||||||
|
|
||||||
|
def initialize(context_tag, parent)
|
||||||
|
@context_tag = context_tag
|
||||||
|
|
||||||
|
@seeder_blocks = []
|
||||||
|
|
||||||
|
@config_options = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_seeder_block(priority, &block)
|
||||||
|
@seeder_blocks << {
|
||||||
|
priority: priority,
|
||||||
|
block: block
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def resolve_key(key)
|
||||||
|
if key.is_a? Array
|
||||||
|
return key.map {|k| k.to_sym }
|
||||||
|
elsif key.is_a? String
|
||||||
|
return key.split('.').map {|k| k.to_sym }
|
||||||
|
elsif key.is_a? Symbol
|
||||||
|
return resolve_key(key.to_s)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def [](key)
|
||||||
|
@config_options&.dig(*resolve_key(key))
|
||||||
|
end
|
||||||
|
def []=(key, value)
|
||||||
|
key = resolve_key(key)
|
||||||
|
|
||||||
|
current_hash = (@config_options ||= {})
|
||||||
|
key[0..-2].each do |key|
|
||||||
|
current_hash = (current_hash[key] ||= {})
|
||||||
|
next if current_hash.is_a? Hash
|
||||||
|
raise ArgumentError, "Attempted to set child-parameter of another parameter!"
|
||||||
|
end
|
||||||
|
|
||||||
|
current_hash[key[-1]] = value
|
||||||
|
|
||||||
|
value
|
||||||
|
end
|
||||||
|
alias set []=
|
||||||
|
|
||||||
|
def set_flag(key, value)
|
||||||
|
set resolve_key(key).append(value), true
|
||||||
|
end
|
||||||
|
def get_flags(key)
|
||||||
|
(@config_options&.dig(*resolve_key(key)) || {}).keys
|
||||||
|
end
|
||||||
|
|
||||||
|
def dig(arg0, *args)
|
||||||
|
@config_options&.dig(arg0, *args)
|
||||||
|
end
|
||||||
|
|
||||||
|
def append(key, value)
|
||||||
|
key = resolve_key key
|
||||||
|
array = @config_options&.dig(*key)
|
||||||
|
|
||||||
|
if array.nil?
|
||||||
|
array = set key, []
|
||||||
|
end
|
||||||
|
|
||||||
|
raise ArgumentError, "Attempted to append to a non-list parameter!" unless array.is_a? Array
|
||||||
|
|
||||||
|
array << value
|
||||||
|
end
|
||||||
|
alias append_to append
|
||||||
|
|
||||||
|
def assert(orig_key, value)
|
||||||
|
key = resolve_key orig_key
|
||||||
|
current_value = @config_options&.dig(*key)
|
||||||
|
|
||||||
|
if current_value.nil?
|
||||||
|
set key, value
|
||||||
|
elsif current_value != value
|
||||||
|
raise ArgumentError, "Config key assertion failed! #{orig_key} should be #{value}, is #{current_value}!"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_config
|
||||||
|
@config_options = nil
|
||||||
|
|
||||||
|
@seeder_blocks.sort { |block| block[:priority] }.each do |block|
|
||||||
|
self.instance_exec(block, &block[:block])
|
||||||
|
end
|
||||||
|
|
||||||
|
self.freeze
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class ContextConfigContainer
|
||||||
|
def initialize
|
||||||
|
@context_configs_seeds = []
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_seeds_for(context_tag)
|
||||||
|
out = []
|
||||||
|
|
||||||
|
@context_configs_seeds.each do |seed|
|
||||||
|
seed_tags = seed[:context_tags]
|
||||||
|
|
||||||
|
seed_tags.each do |tag|
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_to_config(context_config)
|
||||||
|
raise ArgumentError, "No context supplied!" unless context_config.is_a? ContextConfig
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
23
test/faux_build_dir/cpp/main.cpp
Normal file
23
test/faux_build_dir/cpp/main.cpp
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
|
||||||
|
// Your First C++ Program
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
void print_bar() {
|
||||||
|
std::cout << "Bar";
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef COMF_MAIN
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
print_bar();
|
||||||
|
print_foo();
|
||||||
|
|
||||||
|
std::cout << "Hello World!";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
9
test/faux_build_dir/cpp/main.h
Normal file
9
test/faux_build_dir/cpp/main.h
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// comf.reference main.cpp
|
||||||
|
// comf.reference main2.cpp
|
||||||
|
|
||||||
|
void print_foo();
|
||||||
|
void print_bar();
|
22
test/faux_build_dir/cpp/main2.cpp
Normal file
22
test/faux_build_dir/cpp/main2.cpp
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
// Your First C++ Program
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
void print_foo() {
|
||||||
|
std::cout << "Foo";
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef COMF_MAIN
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
print_foo();
|
||||||
|
print_bar();
|
||||||
|
|
||||||
|
std::cout << "Hello World!";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,8 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
#include "main.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "lib_test/test.h"
|
|
1
test/faux_build_dir/vhdl/comf.yml
Normal file
1
test/faux_build_dir/vhdl/comf.yml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
test: Hellooooo
|
108
test/faux_build_dir/vhdl/spi_master_tb.vhd
Normal file
108
test/faux_build_dir/vhdl/spi_master_tb.vhd
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
|
||||||
|
-- comf.include: UQDS_specifics_pkg.vhd
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
library uqdslib;
|
||||||
|
use uqdslib.UQDS_Specifics_pkg.all;
|
||||||
|
|
||||||
|
entity spi_master_tb is
|
||||||
|
end;
|
||||||
|
|
||||||
|
architecture bench of spi_master_tb is
|
||||||
|
-- Clock period
|
||||||
|
constant clk_period : time := 5 ns;
|
||||||
|
-- Generics
|
||||||
|
constant clkdiv : integer := 40;
|
||||||
|
constant clk_idle : std_logic := '1';
|
||||||
|
|
||||||
|
-- Ports
|
||||||
|
signal rst : std_logic := '0';
|
||||||
|
signal clk : std_logic;
|
||||||
|
signal data_tx : std_logic_vector(7 downto 0);
|
||||||
|
signal data_rx : std_logic_vector(7 downto 0);
|
||||||
|
signal send_request : std_logic;
|
||||||
|
signal byte_tx_complete : std_logic;
|
||||||
|
signal byte_rx_complete : std_logic;
|
||||||
|
signal pin_mosi : std_logic;
|
||||||
|
signal pin_miso : std_logic;
|
||||||
|
signal pin_clk : std_logic;
|
||||||
|
|
||||||
|
signal test_done : std_logic := '0';
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
spi_master_inst : uqdslib.UQDS_Specifics_pkg.spi_master
|
||||||
|
generic map (
|
||||||
|
clkdiv => clkdiv,
|
||||||
|
clk_idle => clk_idle
|
||||||
|
)
|
||||||
|
port map (
|
||||||
|
rst => rst,
|
||||||
|
clk => clk,
|
||||||
|
spi_control_to.data_tx => data_tx,
|
||||||
|
spi_control_to.send_request => send_request,
|
||||||
|
spi_control_from.data_rx => data_rx,
|
||||||
|
spi_control_from.byte_tx_complete => byte_tx_complete,
|
||||||
|
spi_control_from.byte_rx_complete => byte_rx_complete,
|
||||||
|
pin_mosi => pin_mosi,
|
||||||
|
pin_miso => pin_miso,
|
||||||
|
pin_clk => pin_clk
|
||||||
|
);
|
||||||
|
|
||||||
|
pin_miso <= pin_mosi;
|
||||||
|
|
||||||
|
clk_process : process
|
||||||
|
begin
|
||||||
|
clk <= '1';
|
||||||
|
wait for clk_period/2;
|
||||||
|
clk <= '0';
|
||||||
|
wait for clk_period/2;
|
||||||
|
|
||||||
|
if(test_done) then wait; end if;
|
||||||
|
end process clk_process;
|
||||||
|
|
||||||
|
data_process : process
|
||||||
|
begin
|
||||||
|
|
||||||
|
rst <= '1';
|
||||||
|
wait for 100 ns;
|
||||||
|
rst <= '0';
|
||||||
|
|
||||||
|
for i in 0 to 4 loop
|
||||||
|
data_tx <= std_logic_vector(to_unsigned(i, data_tx'length));
|
||||||
|
send_request <= '1';
|
||||||
|
wait until falling_edge(byte_tx_complete) for 1 ms;
|
||||||
|
send_request <= '0';
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
for i in 0 to 4 loop
|
||||||
|
data_tx <= std_logic_vector(to_unsigned(i, data_tx'length));
|
||||||
|
send_request <= '1';
|
||||||
|
wait until falling_edge(byte_tx_complete) for 1 ms;
|
||||||
|
send_request <= '0';
|
||||||
|
|
||||||
|
wait for 1.5 us;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
data_tx <= std_logic_vector(to_unsigned(69, data_tx'length));
|
||||||
|
send_request <= '1';
|
||||||
|
wait until falling_edge(byte_tx_complete) for 1 ms;
|
||||||
|
send_request <= '0';
|
||||||
|
|
||||||
|
wait for 400 ns;
|
||||||
|
rst <= '1';
|
||||||
|
wait for 100 ns;
|
||||||
|
rst <= '0';
|
||||||
|
wait for 3 us;
|
||||||
|
|
||||||
|
test_done <= '1';
|
||||||
|
|
||||||
|
wait until falling_edge(byte_rx_complete) for 1 us;
|
||||||
|
|
||||||
|
wait;
|
||||||
|
|
||||||
|
end process data_process;
|
||||||
|
end;
|
Loading…
Add table
Add a link
Reference in a new issue