使用with_mode方法更改对象数据

时间:2018-02-15 15:41:09

标签: origen-sdk

我添加了一些ChipModes,如下所示:

  add_mode :mode1
  add_mode :mode2

当我将DUT模式设置为:mode1时,我想让一些时钟改变它们的设定点。

  with_mode :mode1 do
    clocks(:clk1).setpoint = 1.0.Ghz
    clocks(:clk2).setpoint = 1.2.Ghz
  end

  with_mode :mode2 do
    clocks(:clk1).setpoint = 2.0.Ghz
    clocks(:clk2).setpoint = 2.4.Ghz
  end

我的预期是当DUT芯片模式设置为:mode1或:mode 2时,时钟值会改变。但相反,无论DUT芯片模式如何,这些代码块都会被执行。

enter image description here

时钟最终被设置为第二个with_mode代码块中的值。有没有办法定义仅在设置模式时执行的依赖于模式的操作?

**编辑**

使用this doc作为模型,我将on_mode_changed回调添加到origen/model.rb file,如下所示:

# Set the current mode configuration of the current model
def current_mode=(id)
  @current_mode = id.is_a?(ChipMode) ? id.id : id
  Origen.app.listeners_for(:on_mode_changed).each do |listener|
    listener.on_mode_changed(mode: @current_mode)
  end
  @current_mode
end
alias_method :mode=, :current_mode=

当我设置断点时,直接在我设置模式后,我确实看到模式已经改变,并且DUT响应回调方法,但回调方法没有被调用。

enter image description here enter image description here

这是DUT范围内的回调方法:

def on_mode_changed(options)
  binding.pry
  puts 'found callback method'
  return if options[:mode].nil?
end

**更新**

代码在上面工作,thx!

1 个答案:

答案 0 :(得分:1)

with_mode方法不符合您的想法。它所做的只是设置给定do ... end块的持续时间的模式(并在那里执行,然后执行),但它不会自动地在块中定义的任何内容与当前之间创建实时链接。范围内的模式。

我认为你真正想要的是一个on_mode_changed回调。

Origen需要更新以在模式更改时调用此类回调。这很容易做到,下面是一些如何实现回调的示例:https://github.com/Origen-SDK/origen/search?utf8=%E2%9C%93&q=listeners_for&type=

您的应用程序代码将更改为:

SETPOINTS = { mode1: { clk1: 1.0.Ghz, clk2: 1.2.Ghz },
              mode2: { clk1: 2.0.Ghz, clk2: 2.4.Ghz } }

def on_mode_changed(mode)
  [:clk1, :clk2].each { |clk| clocks(clk).setpoint = SETPOINTS[mode][clk] }
end

您也可以考虑实时更新参数是否适合您,这些是寻找存在理由的神奇解决方案 - http://origen-sdk.org/origen/guides/models/parameters/#Live_Updating_Parameters