# File lib/ruby-vpi.rb, line 46
 46:   def RubyVpi.init_bench aDesignId, aSpecFormat, &aClockTrigger # :yields: clock_signal
 47:     if caller.find {|s| s =~ /^(.*?)_bench.rb:/}
 48:       testName = $1
 49:     else
 50:       raise 'Unable to determine name of test.'
 51:     end
 52: 
 53:     aClockTrigger ||= lambda {|clk| clk.intVal == 1}
 54: 
 55:     useDebugger = !(ENV['DEBUG'] || '').empty?
 56:     useCoverage = !(ENV['COVERAGE'] || '').empty?
 57:     usePrototype = !(ENV['PROTOTYPE'] || '').empty?
 58: 
 59:     # set up code coverage analysis
 60:       if useCoverage
 61:         require 'ruby-vpi/rcov'
 62: 
 63:         RubyVpi.with_coverage_analysis do |a|
 64:           a.dump_coverage_info [
 65:             Rcov::TextReport.new,
 66:             Rcov::HTMLCoverage.new(:destdir => "#{testName}_coverage")
 67:           ]
 68:         end
 69: 
 70:         Vpi::vpi_printf "#{Config::PROJECT_NAME}: coverage analysis is enabled for test #{testName.inspect}\n"
 71:       end
 72: 
 73:     # set up the specification library
 74:       case aSpecFormat
 75:         when :xUnit
 76:           require 'test/unit'
 77: 
 78:         when :rSpec
 79:           ARGV.concat %w[-f s]
 80:           require 'spec'
 81: 
 82:         when :tSpec
 83:           ARGV << '-rs'
 84:           require 'test/spec'
 85:       end
 86: 
 87:     # set up the interactive debugger
 88:       if useDebugger
 89:         require 'ruby-debug'
 90: 
 91:         Debugger.start
 92:         Debugger.post_mortem
 93: 
 94:         Vpi::vpi_printf "#{Config::PROJECT_NAME}: debugger is enabled for test #{testName.inspect}\n"
 95:       end
 96: 
 97:       # suppress undefined method errors when debugger is not enabled
 98:         unless Kernel.respond_to? :debugger
 99:           Kernel.class_eval do
100:             define_method :debugger do
101:               # this is a dummy method!
102:             end
103:           end
104:         end
105: 
106:     # set up the VPI utility layer
107:       require 'ruby-vpi/vpi'
108: 
109:       Object.class_eval do
110:         include Vpi
111:       end
112: 
113:     # load the design under test
114:       unless design = vpi_handle_by_name("#{testName}_bench", nil)
115:         raise "Verilog bench for test #{testName.inspect} is inaccessible."
116:       end
117: 
118:       Kernel.const_set(aDesignId, design)
119:       require "#{testName}_design.rb"
120: 
121:     # load the design's prototype
122:       if usePrototype
123:         require "#{testName}_proto.rb"
124: 
125:         Vpi.module_eval do
126:           define_method :relay_verilog do
127:             design.simulate!
128:           end
129:         end
130: 
131:         Vpi::vpi_printf "#{Config::PROJECT_NAME}: prototype is enabled for test #{testName.inspect}\n"
132: 
133:     # trigger relay_verilog according to aClockTrigger
134:       else
135:         regs = design[VpiReg].sort_by {|h| h.lineNo}
136:         clock = regs.first
137: 
138:         Vpi.module_eval do
139:           # register callback for relay_verilog
140:             time = S_vpi_time.new
141:             time.type = VpiSuppressTime
142: 
143:             value = S_vpi_value.new
144:             value.format = VpiSuppressVal
145: 
146:             alarm = S_cb_data.new
147:             alarm.reason = CbValueChange
148:             alarm.cb_rtn = Vlog_relay_ruby
149:             alarm.obj = clock
150:             alarm.time = time
151:             alarm.value = value
152:             alarm.index = 0
153:             alarm.user_data = nil
154: 
155:             vpi_free_object(vpi_register_cb(alarm))
156: 
157:           alias_method :relay_verilog_old, :relay_verilog
158: 
159:           define_method :relay_verilog do
160:             begin
161:               relay_verilog_old
162:             end until aClockTrigger.call(clock)
163:           end
164:         end
165: 
166:         # XXX: this completes the handshake with pthread_mutex_lock() in relay_main() in the C extension
167:         relay_verilog_old
168:       end
169: 
170:     # load the design's specification
171:       require "#{testName}_spec.rb"
172:   end