From 36d9e77c9695a2a235ab2f73c33cb5849736d681 Mon Sep 17 00:00:00 2001 From: Horst Schirmeier Date: Fri, 7 Nov 2014 11:29:00 +0100 Subject: [PATCH] import-trace: extend sanity checks to time1/2 Up to now, the sanity checks only tested equivalence classes determined by dynamic instructions (instr1/instr2), although the actual timing boundaries (time1/time2) have been the really relevant information for quite some time now. This change extends the checks to time1/time2. Change-Id: I53d1ed10684ff09f6b9f1245ef842dd0d85f2655 --- tools/import-trace/Importer.cc | 81 ++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 8 deletions(-) diff --git a/tools/import-trace/Importer.cc b/tools/import-trace/Importer.cc index 17d77024..b48fa2ea 100644 --- a/tools/import-trace/Importer.cc +++ b/tools/import-trace/Importer.cc @@ -164,10 +164,10 @@ bool Importer::copy_to_database(fail::ProtoIStream &ps) { std::stringstream ss; bool all_ok = true; - // PC-based fault space rectangular, covered, and non-overlapping? - // (same for timing-based fault space?) + // PC- and timing-based fault space non-overlapping, covered, and + // rectangular? - // non-overlapping? + // non-overlapping (instr1/2)? ss << "SELECT t1.variant_id\n" "FROM trace t1\n" @@ -180,12 +180,32 @@ bool Importer::copy_to_database(fail::ProtoIStream &ps) { " OR (t1.instr2 >= t2.instr1 AND t1.instr2 <= t2.instr2)\n" " OR (t1.instr1 < t2.instr1 AND t1.instr2 > t2.instr2))\n" "WHERE t1.variant_id = " << m_variant_id; - if (!sanitycheck("EC overlaps", "not all ECs are disjoint", ss.str())) { + if (!sanitycheck("EC overlaps (instr1/2)", + "not all ECs are disjoint", ss.str())) { all_ok = false; } ss.str(""); - // covered? + // non-overlapping (time1/2)? + ss << + "SELECT t1.variant_id\n" + "FROM trace t1\n" + "JOIN variant v\n" + " ON v.id = t1.variant_id\n" + "JOIN trace t2\n" + " ON t1.variant_id = t2.variant_id AND t1.data_address = t2.data_address\n" + " AND (t1.time1 != t2.time1 OR t2.time2 != t2.time2)\n" + " AND ((t1.time1 >= t2.time1 AND t1.time1 <= t2.time2)\n" + " OR (t1.time2 >= t2.time1 AND t1.time2 <= t2.time2)\n" + " OR (t1.time1 < t2.time1 AND t1.time2 > t2.time2))\n" + "WHERE t1.variant_id = " << m_variant_id; + if (!sanitycheck("EC overlaps (time1/2)", + "not all ECs are disjoint", ss.str())) { + all_ok = false; + } + ss.str(""); + + // covered (instr1/2)? ss << "SELECT t.variant_id, t.data_address,\n" " (SELECT (MAX(t2.instr2) - MIN(t2.instr1) + 1)\n" @@ -201,14 +221,37 @@ bool Importer::copy_to_database(fail::ProtoIStream &ps) { "GROUP BY t.variant_id, t.data_address\n" "HAVING diff != 0\n" "ORDER BY t.data_address\n"; - if (!sanitycheck("FS row sum = total width", + if (!sanitycheck("FS row sum = total width (instr1/2)", "MAX(instr2)-MIN(instr1)+1 == SUM(instr2-instr1+1) not true for all fault-space rows", ss.str())) { all_ok = false; } ss.str(""); - // rectangular? + // covered (time1/2)? + ss << + "SELECT t.variant_id, t.data_address,\n" + " (SELECT (MAX(t2.time2) - MIN(t2.time1) + 1)\n" + " FROM trace t2\n" + " WHERE t2.variant_id = t.variant_id)\n" + " -\n" + " (SELECT SUM(t3.time2 - t3.time1 + 1)\n" + " FROM trace t3\n" + " WHERE t3.variant_id = t.variant_id AND t3.data_address = t.data_address)\n" + " AS diff\n" + "FROM trace t\n" + "WHERE t.variant_id = " << m_variant_id << "\n" + "GROUP BY t.variant_id, t.data_address\n" + "HAVING diff != 0\n" + "ORDER BY t.data_address\n"; + if (!sanitycheck("FS row sum = total width (time1/2)", + "MAX(time2)-MIN(time1)+1 == SUM(time2-time1+1) not true for all fault-space rows", + ss.str())) { + all_ok = false; + } + ss.str(""); + + // rectangular (instr1/2)? ss << "SELECT local.data_address, global.min_instr, global.max_instr, local.min_instr, local.max_instr\n" "FROM\n" @@ -223,13 +266,35 @@ bool Importer::copy_to_database(fail::ProtoIStream &ps) { " GROUP BY t3.variant_id, t3.data_address) AS local\n" " ON (local.min_instr != global.min_instr\n" " OR local.max_instr != global.max_instr)"; - if (!sanitycheck("Global min/max = FS row local min/max", + if (!sanitycheck("Global min/max = FS row local min/max (instr1/2)", "global MIN(instr1)/MAX(instr2) != row-local MIN(instr1)/MAX(instr2)", ss.str())) { all_ok = false; } ss.str(""); + // rectangular (time1/2)? + ss << + "SELECT local.data_address, global.min_time, global.max_time, local.min_time, local.max_time\n" + "FROM\n" + " (SELECT MIN(time1) AS min_time, MAX(time2) AS max_time\n" + " FROM trace t2\n" + " WHERE variant_id = " << m_variant_id << "\n" + " GROUP BY t2.variant_id) AS global\n" + "JOIN\n" + " (SELECT data_address, MIN(time1) AS min_time, MAX(time2) AS max_time\n" + " FROM trace t3\n" + " WHERE variant_id = " << m_variant_id << "\n" + " GROUP BY t3.variant_id, t3.data_address) AS local\n" + " ON (local.min_time != global.min_time\n" + " OR local.max_time != global.max_time)"; + if (!sanitycheck("Global min/max = FS row local min/max (time1/2)", + "global MIN(time1)/MAX(time2) != row-local MIN(time1)/MAX(time2)", + ss.str())) { + all_ok = false; + } + ss.str(""); + if (!all_ok) { return false; }