【发布时间】:2018-01-23 20:50:31
【问题描述】:
我在 SPARK 包中有一个过程,它从非 SPARK 包中调用一些函数。
procedure do_monitoring is
U_C1 : constant Float := Sim.Get_U_C1;
I_L1 : constant Float := Sim.Get_I_L1;
U_C2 : constant Float := Sim.Get_U_C2;
I_L2 : constant Float := Sim.Get_I_L2;
begin
pragma Assert (U_C1 in Float_Signed1000);
pragma Assert (I_L1 in Float_Signed1000);
pragma Assert (U_C2 in Float_Signed1000);
pragma Assert (I_L2 in Float_Signed1000);
-- Monitor PFC intermediate voltage
monitor_signal (monitor_pfc_voltage, U_C1);
-- Monitor PFC inductor current
monitor_signal (monitor_pfc_current, I_L1);
-- Monitor output voltage
monitor_signal (monitor_output_voltage, U_C2);
-- Monitor output inductor current
monitor_signal (monitor_output_current, I_L2);
end do_monitoring;
GNAT 为我从全局受保护类型调用函数的所有四个声明行提供了 info: implicit function contract not available for proof (<function_name> may not return)。
受保护类型函数在非 SPARK 包中定义如下,并使用在受保护类型私有部分中声明的记录 Sim_Out。所有的记录值都用0.0初始化。
function Get_I_L1 return Float is
begin
return Sim_Out.I_L1;
end Get_I_L1;
function Get_U_C1 return Float is
begin
return Sim_Out.U_C1;
end Get_U_C1;
function Get_I_L2 return Float is
begin
return Sim_Out.I_L2;
end Get_I_L2;
function Get_U_C2 return Float is
begin
return Sim_Out.U_C2;
end Get_U_C2;
有什么办法可以解决这个问题?我确实已经添加了一些编译指示来为证明者提供额外的信息subtype Float_Signed1000 is Float range -1_000.0 .. 1_000.0,但这并没有达到我的预期。
我想在这里就这个话题提出你的建议。
【问题讨论】:
-
我会跟进提示“函数可能不会返回”......我们没有 Sim_Get_* 的来源,但你有。有没有通过这些不返回的路径?
-
@BrianDrummond 等一下,我会快速编辑我的问题。
-
我刚刚在谷歌上搜索了“隐式函数合约不可用于证明”(没有引号;有引号我才得到这个问题),第七个答案看起来很相关;在最后一节。当我添加“spark2014”时,Google 对这个命中的排名更高。
-
@SimonWright 如果您粘贴 URL 将不胜感激 :-)
-
试试this ...