生成前的依赖注入

时间:2015-06-30 15:25:06

标签: specman e

这是我之前提问(Difference between "new" and "gen")的后续问题。

有没有办法在生成之前将依赖项传递给结构体?

我有兴趣尝试以易于测试的方式编写代码。目前,我们的代码库经常使用get_enclosing_unit()来获取指向辅助结构的指针,例如翻译器/参数。这导致我们的代码库中存在大量双向依赖关系。这意味着很难独立于其他结构测试碎片。

这是我要避免的一个例子。

pregenerate() is also {
  var translator : my_translator_s = get_enclosing_unit(some_enclosing_unit).get_translator_pointer();
};

我试图避免依赖some_enclosing_unit,因为它与我的结构无关并妨碍了单元测试

由于e中缺少构造函数,我不知道如何在不使用get_enclosing_unit()的情况下从调用单元/结构中传递依赖项。 “new ... with”似乎可能有所帮助,但正如我在上一个问题中所了解的那样,它不会生成基础字段,并且“gen ... keep”不会设置我的生成所需的依赖项,直到之后一代人已经完成。

1 个答案:

答案 0 :(得分:2)

没有简单的答案,因为你的架构似乎已经纠缠在一起了。 您对实例树中的这些双向垂直依赖关系持怀疑态度。一般来说,应该遵循上面的约束(CFA)策略,在那里你将依赖关系传递给层次结构,如

unit child_u {
    p_tr: translator_s;
    keep soft p_tr == NULL; // safety catch, in case you forget to constrain it
};

unit parent_u {
  tr: translator_s;
  child: child_u is instance;
  keep child.p_tr == tr;
};

另外,我建议在单元之间具有生成依赖关系。通过这种方式,您可以将所有指针保存在不可生成的单元中,并将它们连接到生成后调用的单元的connect_pointers()方法中(参见文档)。

extend child_u {
  !p_parent: parent_u;
}
extend parent_u {
  connect_pointers() is also {
    child.p_parent = me;
  };
};

但是当然,child中的约束不能指向parent。 在您绝对需要生成指针的情况下,如果您忘记约束它,请使用keep soft <ptr> == NULL来引发失败。

只是我的2点。