deep_copy 和 gen keeping 在 Specman 中有什么区别?
What is the difference between deep_copy and gen keeping in Specman?
有人能告诉我将一项交易(项目)处理成另一项交易(如以下示例)有什么区别(add_method_port_1 和 add_method_port_2):
add_method_port_1 (added_item: item_s) is {
var new_item: new_item_s;
gen new_item keeping {
it.my_trans_s == added_item.as_a(t_trans_s);
};
};
add_method_port_2 (added_item: item_s) is {
var new_item : new_item_s = deep_copy(added_item.as_a(t_trans_s));
};
其中 new_item_s 看起来像:
struct new_item_s like item_s {
%my_trans_s: t_trans_s;
};
谢谢,
安德里亚
在这个具体的例子中,假设new_item_s只有一个字段my_trans_s,结果没有区别。
在实践中,“留代”的意义和目标与deep_copy大不相同:
- gen保持,即使有'=='约束,实际上是赋值,意味着随机约束生成一个执行iGen逻辑引擎的项目;如果这是一个结构,则调用 pre_generate 和 post_generate 方法,并且 'keeping {}' 块中未提及的所有字段也根据现有约束及其类型属性随机生成。它通常用于创建一个只有一些属性已知的新项目。
- deep_copy 创建给定结构的精确副本(最多有一些细微差别),如果它具有也是结构的字段 - 所有连接的图拓扑的副本。没有随机生成,没有特殊方法,没有执行逻辑引擎。通常它用于在某个时间点捕获数据以供以后分析。
换句话说,如果假设“new_item_s 只有一个字段 my_trans_s” 是错误的,那么结果将大不相同。
实际上,即使Rodion的回答中提到的假设成立,两种方法的结果也是不同的。
使用第一种方法,new_item
指向与原始added_item
相同的my_trans_s
对象,因为约束it.my_trans_s == added_item.as_a(t_trans_s)
表示指针相等。
使用第二种方法,new_item
指向原始 my_trans_s
的 copy,因为 deep_copy
递归复制所有内容。
有人能告诉我将一项交易(项目)处理成另一项交易(如以下示例)有什么区别(add_method_port_1 和 add_method_port_2):
add_method_port_1 (added_item: item_s) is {
var new_item: new_item_s;
gen new_item keeping {
it.my_trans_s == added_item.as_a(t_trans_s);
};
};
add_method_port_2 (added_item: item_s) is {
var new_item : new_item_s = deep_copy(added_item.as_a(t_trans_s));
};
其中 new_item_s 看起来像:
struct new_item_s like item_s {
%my_trans_s: t_trans_s;
};
谢谢, 安德里亚
在这个具体的例子中,假设new_item_s只有一个字段my_trans_s,结果没有区别。
在实践中,“留代”的意义和目标与deep_copy大不相同:
- gen保持,即使有'=='约束,实际上是赋值,意味着随机约束生成一个执行iGen逻辑引擎的项目;如果这是一个结构,则调用 pre_generate 和 post_generate 方法,并且 'keeping {}' 块中未提及的所有字段也根据现有约束及其类型属性随机生成。它通常用于创建一个只有一些属性已知的新项目。
- deep_copy 创建给定结构的精确副本(最多有一些细微差别),如果它具有也是结构的字段 - 所有连接的图拓扑的副本。没有随机生成,没有特殊方法,没有执行逻辑引擎。通常它用于在某个时间点捕获数据以供以后分析。
换句话说,如果假设“new_item_s 只有一个字段 my_trans_s” 是错误的,那么结果将大不相同。
实际上,即使Rodion的回答中提到的假设成立,两种方法的结果也是不同的。
使用第一种方法,new_item
指向与原始added_item
相同的my_trans_s
对象,因为约束it.my_trans_s == added_item.as_a(t_trans_s)
表示指针相等。
使用第二种方法,new_item
指向原始 my_trans_s
的 copy,因为 deep_copy
递归复制所有内容。