2017-09-15 61 views
0

我通過選項哈希傳遞一些參數在我的主流程文件:測試程序流產生失敗的選項

Flow.create(environment: :ws, interface: 'MyTestLibrary::Interface', lib_version: Origen.top_level.lib_version) do 
    import "components/bist" 
    import "components/func" 
    pass 1, softbin: 55 
end 

的問題是,選擇不留當其他子流被調用時是持久的。下面是拳頭時間考驗的接口被稱爲撬會議:

14: def initialize(options = {}) 
    15: options = { 
    16:  lib_version: nil 
    18: }.merge!(options) 
=> 19: binding.pry 
[1] pry(#<MyTestLibrary::Interface>)> options 
=> {:lib_version=>"3.14", :environment=>:ws, :interface=>"MyTestLibrary::Interface"} 

然而,這裏是從第二次撬會議同樣命中斷點:

[1] pry(#<MyTestLibrary::Interface>)> options 
=> {:lib_version=>nil} 

我想我有幾個問題:

  1. Aren't the main flow options supposed to be persistent to sub-flows,用戶沒有添加任何工作?
  2. 爲什麼界面被重新初始化?似乎應該只發生一次一代命令。

提前THX

  • 編輯*

@Ginty,你在你的答案說以下內容:

至於傳遞到頂層的選項流程去吧,關於將它們傳遞給初始化並沒有任何保證。相反接口應該創建啓動和關閉的方法,如果要攔截它們:

但在docs,我看到下列規定:

對於運行它必須實現所有的方法的接口將被你的流程調用。也習慣於創建一個初始化方法,該方法將捕獲傳入Flow.create的任何選項(例如在我們的流程示例中將該環境聲明爲probe)。

此外,啓動方法看起來像是一個回調,它在接口初始化後運行。在接口完成初始化之前,我使用選項散列傳遞的信息需要。下游用戶不應該擔心這是否會造成脆弱的運行順序依賴性? 問候

+0

看起來我錯了有關不傳進初始化,我重新寫我的回答下面的正確理解其背後 – Ginty

回答

1

假設我們有兩個頂級流,以及流組件:

# program/prb1.rb 
Flow.create interface: 'MyApp::Interface', temperature: 25 do 
    import 'components/ram' 
end 

# program/prb2.rb 
Flow.create interface: 'MyApp::Interface', temperature: 125 do 
    import 'components/ram' 
end 

# program/components/_ram.rb 
Flow.create do |options| 

end 

該接口:

module MyApp 
    class Interface 
    include OrigenTesters::ProgramGenerators 

    def initialize(options = {}) 
     puts "New interface!" 
     puts "The temperature is: #{options[:temperature]}" 
     super 
    end 
    end 
end 

然後如果我們產生通過運行PROG兩個流在程序目錄origen p program上,那麼我們會看到該接口被實例化兩次,每個頂級流程一次:

$ origen p program 
[INFO]  0.006[0.006] || ********************************************************************** 
[INFO]  0.010[0.004] || Generating... prb1.rb 
New interface! 
The temperature is: 25 
[INFO]  0.024[0.014] || Generating... prb2.rb 
New interface! 
The temperature is: 125 
[INFO]  0.052[0.028] || Writing... prb1.tf 
[INFO]  0.053[0.001] || *** NEW FILE *** To save it: cp output/testflow/mfh.testflow.group/prb1.tf .ref/prb1.tf 
[INFO]  0.054[0.000] || ********************************************************************** 
[INFO]  0.058[0.004] || Writing... prb2.tf 
[INFO]  0.059[0.001] || *** NEW FILE *** To save it: cp output/testflow/mfh.testflow.group/prb2.tf .ref/prb2.tf 
[INFO]  0.059[0.000] || ********************************************************************** 
Referenced pattern list written to: list/referenced.list 
[INFO]  0.061[0.002] || *** NEW FILE *** To save it: cp list/referenced.list .ref/referenced.list 
[INFO]  0.061[0.000] || ********************************************************************** 

因此,從輸出中我們可以看到接口的兩個實例被創建,每個頂級流生成一個實例,傳遞給Pattern.create的選項被傳遞到接口的初始化方法。

請注意,當頂層流導入子流/組件時,不會實例化新接口。

最初,每次遇到Flow.create時都會創建一個新的接口實例,這與目標被重新加載的時間相同。我們這樣做是因爲當目標持續整個流程時,我們已經看到了早期實施中的問題。這導致一些流程生成順序依賴性開始蔓延到一些應用程序中,例如當你產生它獨立位置與在相同的時間的其他流生成它從prb1.rb輸出是不同的。 所以從一張白紙每次開機,它消除了非有意改變取決於你的目標此前做了流量的輸出的可能性。我們發現,在生成完整的頂級流程的上下文中,我們確實需要一些持久化狀態,以便像跟蹤測試數量一樣。因此妥協的同時,保持在目標上刷新每Flow.create但只有在遇到一個新的頂級Flow.create刷新界面。

到目前爲止,已在實踐中運作良好。但是,如果你覺得你需要一個持續了整整俄程序生成命令的接口,那麼也許你跨一個用例來我們沒有預見,或者也許還有另一種方式來做到你想實現什麼。

如果需要,打開另一個問題以提供更多詳細信息。

+0

感謝非常詳實的答案GINTY的選項。這個實現現在可以工作。 –