callback原始碼分析 callbacks

2021-09-07 15:28:37 字數 3115 閱讀 5074

uvm的callback必須是提供者有預見性的留一些方法在function前後,這樣在使用的時候,進行遍歷排程即可    

設計者,需要從uvm_callback定義乙個基類,只定義function原型定義乙個uvm_callbacks,即pool型別;

在物件類中使用register_cb巨集來註冊callbacks;  

使用者,需要從指定的uvm_callback擴充套件出乙個實現類,並將該類的乙個物件add到對應的pool中;

callbacks中有兩個引數,乙個表示object,乙個表示具體的callback,因為乙個object可能有多個callback;

typed_callback,中只有乙個引數,表示object;

callbacks_base,則通用的定義了乙個uvm_pool,m_pool,以object為索引,返回uvm_queue型別的佇列;

callbacks_base,從uvm_object繼承而來,單例項化設計,其中定義了兩個static變數,由於並不是乙個引數化的類;

所以m_b_inst和m_pool在系統中,只有乙份;

uvm_typed_callbacks從uvm_callbacks_base繼承而來,引數化的類,以callback對應的object為引數;

其中定義了兩個引數化的變數;變數m_t_inst,佇列m_tw_cb_q;

所以兩個static變數根據paramter的不同會有很多份;

uvm_callbacks從uvm_typed_callbacks,繼承而來,有兩個引數,object和callback,

其中定義了兩個主要的static變數,m_inst,m_base_inst,m_base_inst只與object型別有關;

所以不同的object和callback,m_inst都還有多份;

uvm_register_cb(t,cb)的define;

呼叫了乙個uvm_callbacks的function, m_register_pair,並且新定義了乙個變數來接收返回值;

1)首先必須在uvm_callback擴充套件的時候,定義乙個uvm_callbacks的class;

m_register_pair乙個static的函式,呼叫get函式,之後遞迴呼叫initial function,實現所有static變數的定義;

2)uvm_typeid得到static的例項化typeid_base的class;

3)註冊m_typeid和m_cb_typeid的值到uvm_typeid_base的static變數中;乙個object的引數化類,乙個callback的引數化類;

m_base_inst中push back所有的m_inst,即callbacks的種類;

add function,static型別,將object和相應的callback加到對應的callbacks中;

首先呼叫get函式,此時各個inst都不是null,不會執行**;如果callback為null,報錯;

從m_pool中拿到指定object的callback queue;如果為null,新建乙個;

如果對應的callback已經加到對應的object的queue中,報warning;否則根據order的型別,進行push操作;

不同的order順序,決定了定義同一object的callback的執行順序;

如果add的時候,object的值為null,則將callback加到自己型別的queue中;

add_by_name,static function只是在uvm_root中進行find函式呼叫,查詢指定name的comp,在呼叫add函式;

找到的comp佇列都加入callback;

delete函式,static型別,拿到m_pool中的佇列,刪除相應的callback,找不到相應的callback,報warning;

如果delete的時候,傳入的object的值為null,則刪除該型別中的queue中的callback;

delete_by_name類似。

提供給其他class的static函式 實現;

get_first;先拿到該comp型別的物件(null),或者某個物件的callback佇列;

如果沒有add進m_pool中,則也進行add操作;

get_last,get_prev,get_next,類似,但是需要顯示指定itr的值;

使用時也可以呼叫巨集ucm_do_obj_callbacks進行遍歷呼叫;

jquery原始碼解讀之callbacks篇

callbacks模組通過維護乙個 函式列表,來實現對 函式地管理。其操作包括增加,觸發,移除,清空,禁用,鎖定等,是jquery.defrred,jquery.ajax,jquery.ready等依賴的底層模組。let cblist callbacks once memory let fn arg...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

jQuery原始碼解讀二(apply和call)

定義 應用某一物件的乙個方法,用另乙個物件替換當前物件。說明 如果argarray不是乙個有效的陣列或者不是arguments物件,那麼將導致乙個typeerror 如果沒有提供argarray和thisobj任何乙個引數,那麼global物件將被用作thisobj,並且無法被傳遞任何引數。語法 c...