SystemC分析(1)-基本数据类型的实现
来源:互联网 发布:图像处理区域填充算法 编辑:程序博客网 时间:2024/06/05 04:27
Sytemc 数据类型的实现
1. 在SystemC中新增数据类型的声明sc_bv<8>
sc_bv的在源码中的原型,其中位宽为W
template <int W>class sc_bv : public sc_bv_base{public: // constructorssc_bv():sc_bv_base( W ) {}}
1.1 template的应用
知道位宽是怎么传递进入的了吧? 这里采用了C++的模板函数。通常所见的template的用法都是传递一个数据类型或者class type。这里传递了一个Int类型的width(W)。在进行数据类型声明的时候 sc_bv<8>就传递到了其基类sc_bv_base中。
在systemC的源代码中,多数地方都采用了template的通常用法。 例子:带template的构造函数,但是类的声明并没有template。
class sc_bv_base : publicsc_proxy<sc_bv_base>{friend class sc_lv_base; sc_bv_base( constchar* a, int length_ ); template <classX> sc_bv_base( const sc_proxy<X>& a ) : m_len( 0), m_size( 0 ), m_data( 0 ) { init(a.back_cast().length() ); base_type::assign_( a ); }
2. 变量的赋值
2.1 赋值过程追踪
Sc_bv<8> test;
Test = 12;
赋值过程
#0 sc_dt::sc_bv_base::set_word (this=0x7ffff7f5dee0, i=0, w=12) sc_bv_base.h:241
#1 sc_dt::set_words_<sc_dt::sc_bv_base> sc_proxy.h:720
#2 sc_dt::sc_proxy<sc_dt::sc_bv_base>::assign_ (this=0x7ffff7f5dee0,a=12) bit/sc_proxy.h:931
#3 sc_dt::sc_bv_base::operator= (this=0x7ffff7f5dee0, a=12) bit/sc_bv_base.h:179
#4 sc_dt::sc_bv<8>::operator= (this=0x7ffff7f5dee0, a=12) bit/sc_bv.h:187
#5 fft::entry (this=0x7fffffffc780) at fft.cpp:46
#6 semantics (this=0x64def0) at ../../../src/sysc/kernel/sc_process.h:668
#7 sc_core::sc_thread_cor_fn (arg=0x64def0) at sc_thread_process.cpp:114
#8 0x00007ffff7afd781in qt_blocki () at qtmds.s:71
重载操作符 “=”
sc_bv_base&operator = ( unsigned int a ) {base_type::assign_( a ); return *this; } sc_bv<W>& operator = ( unsigned int a ) {sc_bv_base::operator = ( a ); return *this; }class sc_bv_base : publicsc_proxy<sc_bv_base>{typedefsc_proxy<sc_bv_base> base_type;
真正的赋值是在sc_bv_base的基类,也就是sc_proxy<sc_bv_base>中实现的。
具体函数为assign_
在赋值完成后返回了一个类的实例,也就是该赋值操作其实是new了一个新的instance,然后赋值给test这个sc_bv<8>的变量。
2.2. sc_proxy类(文件datatypes/bit/sc_proxy.h)
首先来看看源代码中对该类的作用的描述:
sc_proxy.h -- Proxybase class for vector data types.
Thisclass is created for several purposes:
1) hiding operators from the global namespace that would be
otherwise found by Koenig lookup
2)avoiding repeating the same operations in every class
including proxies that could also beachieved by common
base class, but this method allows
3)improve performance by using non-virtual functions
总的来说就是对所有的类似操作设计一个基类,避免重复的代码编写。但是同virtual function相比,又能够提高性能。
2.3 输出流的重载 “<<”
Cout<< test的过程,总的来说也是对操作符<<的重载,映射到 sc_proxy中的print函数,并调用to_string函数,最后调用系统调用cout进行数据该string
#0 sc_dt::sc_proxy<sc_dt::sc_bv_base>::to_string(this=0x7ffff7f5dee0) at ../../../../include/sysc/datatypes/bit/sc_proxy.h:1388
#1 sc_dt::sc_proxy<sc_dt::sc_bv_base>::print (this=0x7ffff7f5dee0,os=...) at ../../../../include/sysc/datatypes/bit/sc_proxy.h:519
#2 sc_dt::operator<< <sc_dt::sc_bv_base> (os=..., a=...) at../../../../include/sysc/datatypes/bit/sc_proxy.h:1591
#3 ft::entry (this=0x7fffffffc780) at fft.cpp:47
#4 semantics (this=0x64def0) at ../../../src/sysc/kernel/sc_process.h:668
#5 sc_core::sc_thread_cor_fn (arg=0x64def0) at sc_thread_process.cpp:114
#6 0x00007ffff7afd781in qt_blocki () at qtmds.s:71
具体调用的to_string 函数 如下
template <class X>inline const std::string sc_proxy<X>::to_string() const{ const X& x =back_cast(); int len =x.length(); std::string s; //( len + 1 ); for( int i = 0; i< len; ++ i ) { s +=sc_logic::logic_to_char[x.get_bit( len - i - 1 )]; } return s;}
Logic_to_char 为一个查表操作,将数字转换为字符
const char sc_logic::logic_to_char[4] = { '0', '1', 'Z', 'X'};
- SystemC分析(1)-基本数据类型的实现
- SystemC 数据类型
- SystemC分析(2)Method运行机制分析
- GEM5与SystemC混合仿真的实现
- 学习SystemC应具备的C++基本语法
- C语言中基本数据类型的分析
- Nginx源码分析--基本数据类型的别名
- java中的基本数据类型和引用数据类型的分析
- redis基本数据类型分析
- 基本数据类型分析
- 基本数据类型分析
- 基本数据类型分析
- 基本数据类型分析
- 基本数据类型分析
- 基本数据类型分析
- java的数据类型(基本数据类型)
- SystemC,是一门新的语言!
- Java9种基本数据类型分析
- jquery ajax 不能正常调用success的问题
- HDOJ 5124 lines 【线段树 & 离散化】
- Ubuntu14.04 LTS更新源
- windows快捷键
- 测试csdn博客能否在移动端显示
- SystemC分析(1)-基本数据类型的实现
- hdu 1.3.2 排名
- IOS毛玻璃效果
- MFC进度条控件CProgressCtrl实现进度滚动效果
- 数据挖掘的基本过程
- 内存管理高级
- Android 百度地图SDK v_3_4_0学习笔记(一)环境搭建
- Effective C++读书笔记-----条款20:宁以pass-by-reference-to-const替换pass-by-value
- Jackson2笔记