【IEEE_SV-7.11/7.12】数组查询函数和数组操作方法

7.11 Array querying functions

SystemVerilog提供了返回数组信息的系统函数。这些是 l e f t , left, leftright,$low, $high, $increment, $size, d i m e n s i o n s 和 dimensions和 dimensionsunpacked_dimensions。这些函数将在20.7中描述。

7.12 Array manipulation methods

SystemVerilog提供了几个内置的方法来方便数组的搜索、排序和缩减。
调用这些数组方法的一般语法如下:

可选的with子句接受括在括号中的表达式。相反,randomize方法使用的with子句(见18.7)接受一组用大括号括起来的约束。
如果with子句中包含的表达式包含任何副作用,则结果可能是不可预测的。
数组操作方法遍历数组元素,然后使用这些元素对with子句指定的表达式求值。 可选的iterator_argument参数指定了with表达式在每次迭代时用来指定数组元素的变量名。如果不指定,则默认使用item项。iterator_argument的作用域是with表达式。指定iterator_argument而不指定with子句是非法的。

7.12.1 Array locator methods

数组定位器方法对任何非合并的数组(包括队列)进行操作,但它们的返回类型是队列。这些定位器方法允许在数组中搜索满足给定表达式的元素(或其索引)。数组定位器方法按未指定的顺序遍历数组。
索引定位器方法为除关联数组外的所有数组返回一个int类型的队列,关联数组返回一个与关联索引类型相同类型的队列。不允许指定通配符索引类型的关联数组。
如果没有元素满足给定的表达式或数组为空(在队列或动态数组的情况下),则返回空队列。否则,这些方法返回一个包含满足表达式的所有项的队列。索引定位器方法返回一个包含满足表达式的所有项的索引的队列。由with子句指定的可选表达式应计算为布尔值。
支持以下定位器方法(with子句是必需的):
— find() 返回满足给定表达式的所有元素。
— find_index() 返回满足给定表达式的所有元素的索引。
— find_first() 返回满足给定表达式的第一个元素。
— find_first_index() 返回满足给定表达式的第一个元素的索引。
— find_last() 返回满足给定表达式的最后一个元素。
— find_last_index() 返回满足给定表达式的最后一个元素的索引。
第一个或最后一个元素的定义分别是最接近索引最左或最右的元素,但关联数组除外,关联数组必须使用关联数组索引类型的第一个或最后一个方法返回的最接近索引的元素。对于以下定位器方法,如果为给定数组的元素类型定义了关系操作符(<,>,),则可以省略with子句(及其表达式)。如果指定了with子句,则应该为表达式的类型定义关系操作符(<,>,)。
— min() 返回具有最小值或其表达式计算结果为最小值的元素。
— max() 返回具有最大值或其表达式计算结果为最大值的元素。
— unique() 返回具有唯一值或其表达式的计算结果为唯一值的所有元素。对于在数组中找到的每个值,返回的队列只包含一个条目。返回元素的顺序与原始数组的顺序无关。
— unique_index() 返回具有唯一值或其表达式计算结果为唯一值的所有元素的索引。 The index returned for duplicate valued entries may be the index for one of the duplicates.对于在数组中找到的每个值,返回的队列只包含一个条目。返回元素的顺序与原始数组的顺序无关。为重复值条目返回的索引可能是其中一个重复值的索引。
例子:

string SA[10], qs[$];
int IA[int], qi[$];
// 查找所有大于5的项
qi = IA.find( x ) with ( x > 5 );
qi = IA.find( x ); // 应该是一个错误
// 找出所有项等于3的索引
qi = IA.find_index with ( item == 3 );
// 找到等于Bob的第一个项
qs = SA.find_first with ( item == "Bob" );
// 找出等于亨利的最后一项
qs = SA.find_last( y ) with ( y == "Henry" );
// 查找最后一个大于Z的项的索引
qi = SA.find_last_index( s ) with ( s > "Z" );
// 找到最小项
qi = IA.min;
// 查找具有最大数值的字符串
qs = SA.max with ( item.atoi );
// 找到所有唯一的字符串元素
qs = SA.unique;
// 查找所有唯一的小写字符串
qs = SA.unique( s ) with ( s.tolower );

7.12.2 Array ordering methods

数组排序方法对除关联数组外的任何非合并数组(固定大小或动态大小)的元素进行重新排序。
排序方法的原型如下:
function void ordering_method ( array_type iterator = item );
支持以下排序方法:
— reverse() 颠倒数组中元素的顺序。指定with子句将导致编译错误。
— sort() 按照升序对数组排序,可选地使用with子句中的表达式。当为数组元素类型定义关系操作符(<,>,)时,with子句(及其表达式)是可选的。如果指定了with子句,则应该为表达式的类型定义关系操作符(<,>,)。
— rsort() 按照降序对数组进行排序,可选地使用with子句中的表达式。当为数组元素类型定义关系操作符(<,>,)时,with子句(及其表达式)是可选的。如果指定了with子句,则应该为表达式的类型定义关系操作符(<,>,)。
— shuffle() 将数组中元素的顺序随机化。指定with子句将导致编译错误。
例子:

string s[] = { "hello", "sad", "world" };
s.reverse; // s 变为 { "world", "sad", "hello" };
int q[$] = { 4, 5, 3, 1 };
q.sort; // q 变为 { 1, 3, 4, 5 }
struct { byte red, green, blue; } c [512];
c.sort with ( item.red ); // 只使用红色字段对c进行排序
c.sort( x ) with ( {x.blue, x.green} ); // 先按蓝色,然后再按绿色排序

7.12.3 Array reduction methods

数组缩减方法可应用于任何非合并的整数值数组,以将数组缩减为单个值。可选的with子句中的表达式用于指定缩减中使用的值。缩减方法使用这个表达式为每个数组元素求值所生成的值。这与数组定位器方法不同(见7.12.1),其中with子句被用作选择条件。
这些方法的原型如下:
function expression_or_array_type reduction_method (array_type iterator = item);
该方法返回与数组元素类型相同的单个值,如果指定,则返回with子句中表达式的类型。如果为数组元素类型定义了相应的算术或布尔缩减操作,则可以省略with子句。如果指定了with子句,则应为表达式的类型定义相应的算术或布尔缩减操作。
支持以下缩减方法:
— sum() 返回所有数组元素的和,如果指定了with子句,则返回通过对每个数组元素的表达式求值产生的值的和。
— product() 返回所有数组元素的乘积,如果指定了with子句,则返回通过对每个数组元素的表达式求值产生的值的乘积。
— and() 返回所有数组元素的按位和(&),如果指定了with子句,则返回对每个数组元素的表达式求值产生的值的按位和。
— or() 返回所有数组元素的按位OR(|),如果指定了with子句,则返回对每个数组元素的表达式求值产生的值的按位OR。
— xor() 返回所有数组元素的按位XOR(^),如果指定了with子句,则返回对每个数组元素的表达式求值所得值的按位XOR。
例子:

byte b[] = { 1, 2, 3, 4 };
int y;
y = b.sum ; // y 为 10 => 1 + 2 + 3 + 4
y = b.product ; // y 为 24 => 1 * 2 * 3 * 4
y = b.xor with ( item + 4 ); // y为12 => 5 ^ 6 ^ 7 ^ 8
logic [7:0] m [2][2] = '{ '{5, 10}, '{15, 20} };
int y;
y = m.sum with (item.sum with (item)); // y 为 50 => 5+10+15+20
logic bit_arr [1024];
int y;
y = bit_arr.sum with ( int'(item) ); // 强制转换结果为32位

最后一个例子展示了如何将对位数组调用sum的结果强制为32位量。默认情况下,在本例中调用sum的结果将是逻辑类型。将1024位的值相加可能会溢出结果。这种溢出可以通过使用with子句来避免。
指定后,使用with子句确定结果的类型。在with子句中将item转换为int类型会导致数组元素在求和之前扩展为32位。本例中调用sum的结果为32位,因为缩减方法结果的宽度应与with子句中表达式的宽度相同。

7.12.4 Iterator index querying

数组操作方法使用的表达式有时在每次迭代时需要实际的数组下标,而不仅仅是数组元素。迭代器的索引方法返回指定维的索引值。索引法的原型如下:
function int_or_index_type index ( int dimension = 1 );
数组维度的编号与20.7中定义的一致。最慢的变化是维度1。 连续快速变化的维数具有连续较高的维数。如果未指定维度,则默认使用第一个维度。
对于除关联数组外的所有数组迭代器项,索引方法的返回类型为int,关联数组返回与关联索引类型相同类型的索引。不允许指定通配符索引类型的关联数组。
例子:

int arr[];
int q[$];
...
// 找到与其位置(index)相等的所有条目(索引)
q = arr.find with ( item == item.index );
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 LVGL v7.11 中,可以使用 `lv_obj_add_style_local_image_recolor_opa` 函数来实现类似于 `lv_obj_set_style_local_image_recolor` 的功能。这个函数用于设置对象的局部样式,以改变图片的颜色。 以下是示例代码: ```c #include "lvgl/lvgl.h" void lv_example_image_colors(void) { /* 创建一个画布 */ lv_obj_t * canvas = lv_canvas_create(lv_scr_act(), NULL); lv_canvas_set_buffer(canvas, LV_COLOR_DEPTH); lv_obj_set_size(canvas, 200, 200); lv_obj_center(canvas); /* 加载图片到画布 */ lv_img_set_src(canvas, "path_to_your_image.png"); /* 创建一个按钮 */ lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL); lv_btn_set_fit2(btn, LV_FIT_TIGHT, LV_FIT_TIGHT); lv_obj_align(btn, canvas, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); /* 创建一个标签,用于显示颜色选择器的当前颜色 */ lv_obj_t * label = lv_label_create(btn, NULL); lv_label_set_text(label, "Color: None"); /* 创建颜色选择器 */ lv_obj_t * colorpicker = lv_colorpicker_create(btn, NULL); lv_obj_align(colorpicker, label, LV_ALIGN_OUT_RIGHT_MID, 10, 0); lv_colorpicker_set_color_mode(colorpicker, LV_COLOR_PICKER_MODE_HUE); /* 设置颜色选择器的回调函数 */ lv_colorpicker_set_color_changed_cb(colorpicker, [](lv_color_t color) { /* 更新标签的文本和画布的颜色 */ char buf[32]; sprintf(buf, "Color: #%02x%02x%02x", color.ch.red, color.ch.green, color.ch.blue); lv_label_set_text(label, buf); lv_obj_add_style_local_image_recolor_opa(canvas, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, color.ch.red); }); } ``` 同样,请确保将 `path_to_your_image.png` 替换为您实际的图片路径。此示例代码创建了一个画布,加载了一张图片,并在按钮上添加了一个颜色选择器,用于改变画布图片的颜色。当选择器的颜色发生变化时,会更新按钮上的标签文本和画布的颜色。 希望这个示例代码对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值