#lang ivy1.7
include collections
type bit
type byte
type bytes
type int
type levelD = {d1, d2, d3, d4}
type levelE = {e1, e2, e3}
type levelA = struct{
idA : int,
valueA : bit
}
type levelB = struct{
idB : int,
valueB: byte
}
type levelC = struct{
idC : int,
valueC : bytes
}
# -------------------------------
type level4_t
object level4A_t ={
variant this of level4_t = struct{
id4A : int,
value4A : levelD
}
}
object level4B_t ={
variant this of level4_t = struct{
id4B : int,
value4B : levelE
}
}
# --------------------------------
type level3_t
object level3_A = {
variant this of level3_t = struct{
id3 : int,
value3 :levelA
}
}
#instance level3_B : level3(levelB)
object level3_B = {
variant this of level3_t = struct{
id3 : int,
value3 :levelB
}
}
#instance level3_C : level3(levelC)
object level3_C = {
variant this of level3_t = struct{
id3 : int,
value3 :levelC
}
}
#instance level3_level4 : level3(level4_t)
object level3_level4 = {
variant this of level3_t = struct{
id3 : int,
value3 :level4_t
}
}
# --------------------------------
type level2_t
object level2_messageA_t ={
variant this of level2_t = struct{
id2 : int,
criticality: bit,
value : level3_t
}
}
object level2_messageB_t ={
variant this of level2_t = struct{
id2 : int,
criticality: bit,
value : levelD
}
}
object level2_messageC_t ={
variant this of level2_t = struct{
id2 : int,
criticality: bit,
value : levelE
}
}
# --------------------------------------------
type level1_t
object level1_message_t = {
variant this of level1_t = struct{
id1 : int,
list1 : vector[level2_t]
}
}
object level1_msgA_t = {
variant this of level1_t = struct{
id1 : int,
list1 : vector[levelA]
}
}
object level1_msgB_t = {
variant this of level1_t = struct{
id1 : int,
list1 : vector[levelB]
}
}
# --------------------------------------------
type level0_t
object level0_message_t = {
variant this of level0_t= struct{
id0 : int,
value0: level1_message_t
}
}
When I attempt to use the random generator to create random instances of a message of type level0_t
, I obtain the following sample messages
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageC_t:{id2:0,criticality:0,value:e1}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageA_t:{id2:0,criticality:0,value:{}}},{level2_messageC_t:{id2:0,criticality:0,value:e1}},{level2_messageA_t:{id2:0,criticality:0,value:{}}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageB_t:{id2:0,criticality:0,value:d3}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageC_t:{id2:0,criticality:0,value:e3}},{level2_messageA_t:{id2:0,criticality:0,value:{}}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageC_t:{id2:0,criticality:0,value:e3}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageA_t:{id2:0,criticality:0,value:{}}},{level2_messageB_t:{id2:0,criticality:0,value:d3}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageB_t:{id2:0,criticality:0,value:d1}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageA_t:{id2:0,criticality:0,value:{}}},{level2_messageC_t:{id2:0,criticality:0,value:e3}},{level2_messageA_t:{id2:0,criticality:0,value:{}}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageA_t:{id2:0,criticality:0,value:{}}},{level2_messageA_t:{id2:0,criticality:0,value:{}}},{level2_messageB_t:{id2:0,criticality:0,value:d2}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageA_t:{id2:0,criticality:0,value:{}}},{level2_messageC_t:{id2:0,criticality:0,value:e3}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageA_t:{id2:0,criticality:0,value:{}}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageC_t:{id2:0,criticality:0,value:e2}},{level2_messageC_t:{id2:0,criticality:0,value:e1}},{level2_messageA_t:{id2:0,criticality:0,value:{}}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageC_t:{id2:0,criticality:0,value:e1}},{level2_messageC_t:{id2:0,criticality:0,value:e3}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageC_t:{id2:0,criticality:0,value:e1}},{level2_messageB_t:{id2:0,criticality:0,value:d3}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageB_t:{id2:0,criticality:0,value:d4}},{level2_messageC_t:{id2:0,criticality:0,value:e3}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageA_t:{id2:0,criticality:0,value:{}}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageC_t:{id2:0,criticality:0,value:e1}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageB_t:{id2:0,criticality:0,value:d3}},{level2_messageC_t:{id2:0,criticality:0,value:e1}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageA_t:{id2:0,criticality:0,value:{}}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageA_t:{id2:0,criticality:0,value:{}}}]}}})
> intf.send({level0_message_t:{id0:0,value0:{id1:0,list1:[{level2_messageA_t:{id2:0,criticality:0,value:{}}}]}}})
template <>
void __randomize<message_app::level2_messageA_t>( gen &g, const z3::expr &v){
__randomize<int>(g,g.apply("level2_messageA_t.id2",v));
__randomize<int>(g,g.apply("level2_messageA_t.criticality",v));
}
template <>
void __from_solver<message_app::level2_messageA_t>( gen &g, const z3::expr &v,message_app::level2_messageA_t &res){
__from_solver(g,g.apply("level2_messageA_t.id2",v),res.id2);
__from_solver(g,g.apply("level2_messageA_t.criticality",v),res.criticality);
__from_solver(g,g.apply("level2_messageA_t.value",v),res.value);
}
Is there a way in which the compiler is constrained to handle random-generation only upto 2 depth-levels?