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进行遍历调用;

      

callback源码分析——callbacks的更多相关文章

  1. Zepto源码分析-callbacks模块

    // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT licens ...

  2. callback源码分析——callback_iter和callback

    uvm_callback_iter,定义了function,first,last,next,prev的函数, 其中定义的还是相应uvm_callbacks的静态函数: 所以之前uvm_callback ...

  3. 读Zepto源码之Callbacks模块

    Callbacks 模块并不是必备的模块,其作用是管理回调函数,为 Defferred 模块提供支持,Defferred 模块又为 Ajax 模块的 promise 风格提供支持,接下来很快就会分析到 ...

  4. zepto源码分析系列

    如果你也开发移动端web,如果你也用zepto,应该值得你看看.有问题请留言. Zepto源码分析-架构 Zepto源码分析-zepto(DOM)模块 Zepto源码分析-callbacks模块 Ze ...

  5. jQuery使用():Callbacks回调函数列表之异步编程(含源码分析)

    Callbacks的基本功能回调函数缓存与调用 特定需求模式的Callbacks Callbacks的模拟源码 一.Callbacks的基本功能回调函数缓存与调用 Callbacks即回调函数集合,在 ...

  6. jQuery 2.0.3 源码分析 回调对象 - Callbacks

    源码API:http://api.jquery.com/jQuery.Callbacks/ jQuery.Callbacks()是在版本1.7中新加入的.它是一个多用途的回调函数列表对象,提供了一种强 ...

  7. requirejs源码分析: requirejs 方法–2. context.require(deps, callback, errback);

    上一篇 requirejs源码分析: requirejs 方法–1. 主入口  中的return context.require(deps, callback, errback);  调用的是make ...

  8. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  9. jQuery实现DOM加载方法源码分析

    传统的判断dom加载的方法 使用 dom0级 onload事件来进行触发所有浏览器都支持在最初是很流行的写法 我们都熟悉这种写法: window.onload=function(){ ... }  但 ...

随机推荐

  1. sparking water

    1 2 It provides a way to initialize H2O services on each node in the Spark cluster and to access dat ...

  2. Python操作Mysql数据库——多表组合查询

    前面我们介绍了单张表的查询,包括模糊查询.分组.排序.各种筛选条件等等操作,在实际应用中,查询的数据往往不止局限在一张表里,通常需要多张表在一起进行组合查询,今天我们将会对Mysql当中的多张有关联的 ...

  3. LeetCode 589 N-ary Tree Preorder Traversal 解题报告

    题目要求 Given an n-ary tree, return the preorder traversal of its nodes' values. 题目分析及思路 题目给出一棵N叉树,要求返回 ...

  4. 2018/05/11 PHP 设计模式之 适配器模式

    什么是适配器模式? 简单来说,我想买一根充电线,我买一根安卓的?还是买一根苹果的? 我也不确定,因为我以可能会换手机,对于我的形式我也不确定. 所以,我要买一根可以同时适配 安卓/苹果 的线. 所谓适 ...

  5. json 脚本入库的几种方法

    json 脚本入库的几种方法,见代码: #-*- encoding: utf-8 -*- #第一种mongodb入库 # from pymongo import * # import json # c ...

  6. linux根文件系统制作,busybox启动流程分析

    分析 busybox-1.1.6 启动流程,并 制作一个小的根文件系统 源码百度云链接:https://pan.baidu.com/s/1tJhwctqj4VB4IpuKCA9m1g 提取码 :l10 ...

  7. 【雅思】【写作】【大作文】Advantage VS. Disadvantage

    Advantage VS. Disadvantage Advantage vs. Disadvantage 社会现象或者做法 “People can work or study on the Inte ...

  8. head 命令 读取文件的前n行,默认查看文件的前十行

    head 命令 读取文件的前n行 默认查看文件的前十行 head /etc/passwd # 默认查看文件的前十行 /etc/passwd # 查看文件的前两行

  9. 用composer安装laravel-bjyblog

    前面讲了两行命令composer的安装,现在我们来操作一下composer安装基于laravel的博客laravel-bjyblog.测试环境是linux,bt面板,php7.2安装扩展fileinf ...

  10. 系统进不去怎么办?教你利用bootice工具引导修复系统

    http://sh.qihoo.com/pc/9c2e9690a82b8cd38?sign=360_e39369d1 U盘装机大师下载地址 http://www.upandashi.com/down/