blob: e2f7b235543e640965cfa2018e19c5813d85ce94 [file]
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.io.*;
/* Randomly generates problem instances that contain nested array operations */
// Both Indexes and values have the same bitwidth, potentially missing some errors.
// Doesn't generate extensional problems!
public class ArrayGenerator
{
public static List<String> bits = new ArrayList<String>();
public static List<String> arrays = new ArrayList<String>();
static Random r = new Random();
static int MAX_DEPTH;
static int numberOfInstances = 500;
public static void main(String[] args) throws IOException
{
bits.add("b1");
bits.add("b2");
bits.add("b3"); // Some case statements depend on there being 3 bitvectors.
arrays.add("a1");
arrays.add("a2");
arrays.add("a3");
for (int i=0; i < numberOfInstances; i++)
{
// When we get to the nesting depth, start to return leaf nodes (like symbols).
MAX_DEPTH = r.nextInt(15) +1;
randomGenerate("f"+i+".smt");
}
}
static void randomGenerate(String fileName) throws IOException
{
StringBuilder output = new StringBuilder();
output.append("(\n");
output.append("benchmark t.smt\n");
output.append(":source {automatically generated}\n");
output.append(":status unknown\n");
output.append(":logic QF_AUFBV\n");
for (String s : bits)
{
output.append(":extrafuns (( " + s + " BitVec[4]))\n");
}
for (String s : arrays)
{
output.append(":extrafuns (( " + s + " Array[4:4]))\n");
}
int top = r.nextInt(10);
for (int i = 0; i < top+1; i++)
output.append(":assumption " + generateProp(0) + "\n");
output.append(":formula true \n )\n");
FileWriter fstream = new FileWriter(fileName);
BufferedWriter out = new BufferedWriter(fstream);
out.write(output.toString());
out.close();
}
// Arrays are either array symbols, ites, or stores.
static String generateArray(int depth)
{
int next =r.nextInt(5);
if (depth > MAX_DEPTH)
next = next %3;
depth++;
switch (next)
{
case 0:
case 1:
case 2:
return arrays.get(next);
case 3:
return "(ite " + generateProp(depth) + " " + generateArray(depth) + " " + generateArray(depth) + " )";
case 4:
return "(store " + generateArray(depth) + " " + generateBit(depth) + " " + generateBit(depth) + " )";
}
throw new RuntimeException("Never here");
}
// BitVectors.
static String generateBit(int depth)
{
int next =r.nextInt(6);
if (depth > MAX_DEPTH)
next = next %3;
depth++;
switch (next)
{
case 0:
case 1:
case 2:
return bits.get(next);
case 3:
return "(select " + generateArray(depth) + " " + generateBit(depth) + " )";
case 4:
return "(ite " + generateProp(depth) + " " + generateBit(depth) + " " + generateBit(depth) + " )";
case 5:
return "(bvadd " + generateBit(depth) + " " + generateBit(depth) + " )";
}
throw new RuntimeException("Never here");
}
static String generateProp(int depth)
{
int next =r.nextInt(6);
if (depth > MAX_DEPTH)
next = next %2;
depth++;
switch (next)
{
case 0:
return "true";
case 1:
return "(= " + generateBit(depth) + " " + generateBit(depth) + " )";
case 2:
return "(or " + generateProp(depth) + " " + generateProp(depth) + " )";
case 3:
return "(bvslt " + generateBit(depth) + " " + generateBit(depth) + " )";
case 4:
return "(iff " + generateProp(depth) + " " + generateProp(depth) + " )";
case 5:
return "(ite " + generateProp(depth) + " " + generateProp(depth) + " " + generateProp(depth) + " )";
}
throw new RuntimeException("Never here");
}
}