callback源码分析——callbacks
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的更多相关文章
- Zepto源码分析-callbacks模块
// Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT licens ...
- callback源码分析——callback_iter和callback
uvm_callback_iter,定义了function,first,last,next,prev的函数, 其中定义的还是相应uvm_callbacks的静态函数: 所以之前uvm_callback ...
- 读Zepto源码之Callbacks模块
Callbacks 模块并不是必备的模块,其作用是管理回调函数,为 Defferred 模块提供支持,Defferred 模块又为 Ajax 模块的 promise 风格提供支持,接下来很快就会分析到 ...
- zepto源码分析系列
如果你也开发移动端web,如果你也用zepto,应该值得你看看.有问题请留言. Zepto源码分析-架构 Zepto源码分析-zepto(DOM)模块 Zepto源码分析-callbacks模块 Ze ...
- jQuery使用():Callbacks回调函数列表之异步编程(含源码分析)
Callbacks的基本功能回调函数缓存与调用 特定需求模式的Callbacks Callbacks的模拟源码 一.Callbacks的基本功能回调函数缓存与调用 Callbacks即回调函数集合,在 ...
- jQuery 2.0.3 源码分析 回调对象 - Callbacks
源码API:http://api.jquery.com/jQuery.Callbacks/ jQuery.Callbacks()是在版本1.7中新加入的.它是一个多用途的回调函数列表对象,提供了一种强 ...
- requirejs源码分析: requirejs 方法–2. context.require(deps, callback, errback);
上一篇 requirejs源码分析: requirejs 方法–1. 主入口 中的return context.require(deps, callback, errback); 调用的是make ...
- jQuery源码分析系列
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...
- jQuery实现DOM加载方法源码分析
传统的判断dom加载的方法 使用 dom0级 onload事件来进行触发所有浏览器都支持在最初是很流行的写法 我们都熟悉这种写法: window.onload=function(){ ... } 但 ...
随机推荐
- 2016年蓝桥杯省赛A组c++第4题(算法填空)
/* 排序在各种场合经常被用到. 快速排序是十分常用的高效率的算法. 其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它. 这样,排序问题 ...
- ubuntu物理机上搭建Kubernetes集群 -- 准备
准备工作 1.kubernetes架构 2.三台ubuntu主机: 操作系统:ubuntu-16.04.1-server-amd64 docker: 1.安装 使用命令 sudo apt-get in ...
- LeetCode 669 Trim a Binary Search Tree 解题报告
题目要求 Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so t ...
- python摸爬滚打之day05----字典
1.字典介绍 1.1 结构: {key1: value1, key2: value2, ....} ,由很多键值对构成. 在字典的key-value(键值对)中, key(键)必须是可哈希(不可变 ...
- Ansible 快速上手(转)
add by zhj: 执行Ansible(发音时,重音在最前面)命令有两种方式,一种是ad-hoc形式,另一种是playbooks,对于软件开发者来说,一般使用ad-hoc就足够了.playbook ...
- 使用shell脚本监控用户登陆服务器并发送提示信息给微信
1.需要在/etc/ssh/目录下面创建一个名为sshrc的文件,执行权限可给可不给,那么在有人通过ssh远程登录这台服务器的时候,这段脚本就会被执行 #!/bin/bash ###V1---### ...
- Linux系统启动排错实验集合
Centos6系统启动流程 1. post 加电自检 检查硬件环境 2. 选择一个硬件类型引导启动 mbr 446字节 grub stage1 3. 加载boot分区的文 ...
- mybatis级联
mybatis中有时候表不能都分成单表进行查询,表之间会有联系,这时候需要将表进行级联 下面讲一下如何将mybatis中 的表进行级联.映射表关系如下 1:创建数据表 DROP TABLE IF EX ...
- ionic 版本内更新问题汇总
1.签名不一致导致的更新失败 2.解析软件包出现问题 3.当文件下载完.在android 8.0中不能打开apk包的问题 解决方案:在config.xml中添加: <platform name= ...
- [py]软件编程知识骨架+py常见数据结构
认识算法的重要性 - 遇到问题? 学完语言,接到需求,没思路? 1.学会了语言,能读懂别人的代码, 但是自己没解决问题的能力,不能够把实际问题转换为代码,自己写出来.(这是只是学会一门语言的后果),不 ...