Commit 0f178288 authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

dotty: switch to horizontal output and add options

* src/tgbaalgos/dotty.cc, src/tgbaalgos/dotty.hh: Add an options
parameter.
* src/bin/randaut.cc, src/bin/autfilt.cc, src/bin/dstar2tgba.cc,
src/bin/ltl2tgba.cc, wrap/python/ajax/spot.in: Use it.
* src/tgbatest/det.test, src/tgbatest/dstar.test,
src/tgbatest/ltl2tgba.cc, src/tgbatest/monitor.test,
src/tgbatest/neverclaimread.test, src/tgbatest/tgbaread.test,
src/graphtest/tgbagraph.test: Adjust
because automata are now output horizontally.
* NEWS: Mention the change.
parent 0842494f
...@@ -71,6 +71,11 @@ New in spot 1.99a (not yet released) ...@@ -71,6 +71,11 @@ New in spot 1.99a (not yet released)
- Boost is not used anymore. - Boost is not used anymore.
- GraphViz output now uses an horizontal layout by default.
The --dot option of the various command-line tools takes an
optional parameter to fine-tune the GraphViz output (including
vertical layout, round states, and named automata).
- The tgba_succ_iterator interface has changed. Methods next(), - The tgba_succ_iterator interface has changed. Methods next(),
and first() should now return a bool indicating whether the and first() should now return a bool indicating whether the
current iteration is valid. current iteration is valid.
......
...@@ -104,7 +104,10 @@ static const argp_option options[] = ...@@ -104,7 +104,10 @@ static const argp_option options[] =
/**************************************************/ /**************************************************/
{ 0, 0, 0, 0, "Output format:", 3 }, { 0, 0, 0, 0, "Output format:", 3 },
{ "count", 'c', 0, 0, "print only a count of matched automata", 0 }, { "count", 'c', 0, 0, "print only a count of matched automata", 0 },
{ "dot", OPT_DOT, 0, 0, "GraphViz's format (default)", 0 }, { "dot", OPT_DOT, "c|h|n|N|t|v", OPTION_ARG_OPTIONAL,
"GraphViz's format (default). Add letters to chose (c) circular nodes, "
"(h) horizontal layout, (v) vertical layout, (n) with name, "
"(N) without name, (t) always transition-based acceptance.", 0 },
{ "hoaf", 'H', "s|t|m|l", OPTION_ARG_OPTIONAL, { "hoaf", 'H', "s|t|m|l", OPTION_ARG_OPTIONAL,
"Output the automaton in HOA format. Add letters to select " "Output the automaton in HOA format. Add letters to select "
"(s) state-based acceptance, (t) transition-based acceptance, " "(s) state-based acceptance, (t) transition-based acceptance, "
...@@ -206,6 +209,7 @@ static const struct argp_child children[] = ...@@ -206,6 +209,7 @@ static const struct argp_child children[] =
static enum output_format { Dot, Lbtt, Lbtt_t, Spin, Spot, Stats, Hoa, static enum output_format { Dot, Lbtt, Lbtt_t, Spin, Spot, Stats, Hoa,
Quiet, Count } format = Dot; Quiet, Count } format = Dot;
const char* opt_dot = nullptr;
typedef spot::tgba_digraph::graph_t::trans_storage_t tr_t; typedef spot::tgba_digraph::graph_t::trans_storage_t tr_t;
typedef std::set<std::vector<tr_t>> unique_aut_t; typedef std::set<std::vector<tr_t>> unique_aut_t;
static long int match_count = 0; static long int match_count = 0;
...@@ -314,6 +318,7 @@ parse_opt(int key, char* arg, struct argp_state*) ...@@ -314,6 +318,7 @@ parse_opt(int key, char* arg, struct argp_state*)
} }
case OPT_DOT: case OPT_DOT:
format = Dot; format = Dot;
opt_dot = arg;
break; break;
case OPT_EDGES: case OPT_EDGES:
opt_edges = parse_range(arg, 0, std::numeric_limits<int>::max()); opt_edges = parse_range(arg, 0, std::numeric_limits<int>::max());
...@@ -640,7 +645,8 @@ namespace ...@@ -640,7 +645,8 @@ namespace
case Dot: case Dot:
spot::dotty_reachable(std::cout, aut, spot::dotty_reachable(std::cout, aut,
(type == spot::postprocessor::BA) (type == spot::postprocessor::BA)
|| (type == spot::postprocessor::Monitor)); || (type == spot::postprocessor::Monitor),
opt_dot);
break; break;
case Lbtt: case Lbtt:
spot::lbtt_reachable(std::cout, aut, type == spot::postprocessor::BA); spot::lbtt_reachable(std::cout, aut, type == spot::postprocessor::BA);
......
...@@ -70,7 +70,10 @@ static const argp_option options[] = ...@@ -70,7 +70,10 @@ static const argp_option options[] =
"of the given property)", 0 }, "of the given property)", 0 },
/**************************************************/ /**************************************************/
{ 0, 0, 0, 0, "Output format:", 3 }, { 0, 0, 0, 0, "Output format:", 3 },
{ "dot", OPT_DOT, 0, 0, "GraphViz's format (default)", 0 }, { "dot", OPT_DOT, "c|h|n|N|t|v", OPTION_ARG_OPTIONAL,
"GraphViz's format (default). Add letters to chose (c) circular nodes, "
"(h) horizontal layout, (v) vertical layout, (n) with name, "
"(N) without name, (t) always transition-based acceptance.", 0 },
{ "hoaf", 'H', "s|t|m|l", OPTION_ARG_OPTIONAL, { "hoaf", 'H', "s|t|m|l", OPTION_ARG_OPTIONAL,
"Output the automaton in HOA format. Add letters to select " "Output the automaton in HOA format. Add letters to select "
"(s) state-based acceptance, (t) transition-based acceptance, " "(s) state-based acceptance, (t) transition-based acceptance, "
...@@ -126,6 +129,7 @@ const struct argp_child children[] = ...@@ -126,6 +129,7 @@ const struct argp_child children[] =
}; };
enum output_format { Dot, Lbtt, Lbtt_t, Spin, Spot, Stats, Hoa } format = Dot; enum output_format { Dot, Lbtt, Lbtt_t, Spin, Spot, Stats, Hoa } format = Dot;
const char* opt_dot = nullptr;
bool utf8 = false; bool utf8 = false;
const char* stats = ""; const char* stats = "";
const char* hoa_opt = 0; const char* hoa_opt = 0;
...@@ -167,6 +171,7 @@ parse_opt(int key, char* arg, struct argp_state*) ...@@ -167,6 +171,7 @@ parse_opt(int key, char* arg, struct argp_state*)
break; break;
case OPT_DOT: case OPT_DOT:
format = Dot; format = Dot;
opt_dot = arg;
break; break;
case OPT_LBTT: case OPT_LBTT:
if (arg) if (arg)
...@@ -315,7 +320,8 @@ namespace ...@@ -315,7 +320,8 @@ namespace
case Dot: case Dot:
spot::dotty_reachable(std::cout, aut, spot::dotty_reachable(std::cout, aut,
(type == spot::postprocessor::BA) (type == spot::postprocessor::BA)
|| (type == spot::postprocessor::Monitor)); || (type == spot::postprocessor::Monitor),
opt_dot);
break; break;
case Lbtt: case Lbtt:
spot::lbtt_reachable(std::cout, aut, type == spot::postprocessor::BA); spot::lbtt_reachable(std::cout, aut, type == spot::postprocessor::BA);
......
...@@ -72,7 +72,10 @@ static const argp_option options[] = ...@@ -72,7 +72,10 @@ static const argp_option options[] =
{ 0, 0, 0, 0, "Output format:", 3 }, { 0, 0, 0, 0, "Output format:", 3 },
{ "csv-escape", OPT_CSV, 0, 0, "quote formula output by %f in --format " { "csv-escape", OPT_CSV, 0, 0, "quote formula output by %f in --format "
"for use in CSV file", 0 }, "for use in CSV file", 0 },
{ "dot", OPT_DOT, 0, 0, "GraphViz's format (default)", 0 }, { "dot", OPT_DOT, "c|h|n|N|t|v", OPTION_ARG_OPTIONAL,
"GraphViz's format (default). Add letters to chose (c) circular nodes, "
"(h) horizontal layout, (v) vertical layout, (n) with name, "
"(N) without name, (t) always transition-based acceptance.", 0 },
{ "hoa", 'H', "s|t|m|l", OPTION_ARG_OPTIONAL, { "hoa", 'H', "s|t|m|l", OPTION_ARG_OPTIONAL,
"Output the automaton in HOA format. Add letters to select " "Output the automaton in HOA format. Add letters to select "
"(s) state-based acceptance, (t) transition-based acceptance, " "(s) state-based acceptance, (t) transition-based acceptance, "
...@@ -124,7 +127,7 @@ const struct argp_child children[] = ...@@ -124,7 +127,7 @@ const struct argp_child children[] =
}; };
enum output_format { Dot, Lbtt, Lbtt_t, Spin, Spot, Stats, Hoa } format = Dot; enum output_format { Dot, Lbtt, Lbtt_t, Spin, Spot, Stats, Hoa } format = Dot;
bool utf8 = false; const char* opt_dot = nullptr;
const char* stats = ""; const char* stats = "";
const char* hoa_opt = 0; const char* hoa_opt = 0;
spot::option_map extra_options; spot::option_map extra_options;
...@@ -166,6 +169,7 @@ parse_opt(int key, char* arg, struct argp_state*) ...@@ -166,6 +169,7 @@ parse_opt(int key, char* arg, struct argp_state*)
break; break;
case OPT_DOT: case OPT_DOT:
format = Dot; format = Dot;
opt_dot = arg;
break; break;
case OPT_LBTT: case OPT_LBTT:
if (arg) if (arg)
...@@ -245,7 +249,8 @@ namespace ...@@ -245,7 +249,8 @@ namespace
case Dot: case Dot:
spot::dotty_reachable(std::cout, aut, spot::dotty_reachable(std::cout, aut,
(type == spot::postprocessor::BA) (type == spot::postprocessor::BA)
|| (type == spot::postprocessor::Monitor)); || (type == spot::postprocessor::Monitor),
opt_dot);
break; break;
case Lbtt: case Lbtt:
spot::lbtt_reachable(std::cout, aut, type == spot::postprocessor::BA); spot::lbtt_reachable(std::cout, aut, type == spot::postprocessor::BA);
......
...@@ -93,7 +93,10 @@ static const argp_option options[] = ...@@ -93,7 +93,10 @@ static const argp_option options[] =
RANGE_DOC, RANGE_DOC,
/**************************************************/ /**************************************************/
{ 0, 0, 0, 0, "Output format:", 3 }, { 0, 0, 0, 0, "Output format:", 3 },
{ "dot", OPT_DOT, 0, 0, "GraphViz's format (default)", 0 }, { "dot", OPT_DOT, "c|h|n|N|t|v", OPTION_ARG_OPTIONAL,
"GraphViz's format (default). Add letters to chose (c) circular nodes, "
"(h) horizontal layout, (v) vertical layout, (n) with name, "
"(N) without name, (t) always transition-based acceptance.", 0 },
{ "hoaf", 'H', "s|t|m|l", OPTION_ARG_OPTIONAL, { "hoaf", 'H', "s|t|m|l", OPTION_ARG_OPTIONAL,
"Output the automaton in HOA format. Add letters to select " "Output the automaton in HOA format. Add letters to select "
"(s) state-based acceptance, (t) transition-based acceptance, " "(s) state-based acceptance, (t) transition-based acceptance, "
...@@ -117,6 +120,7 @@ static const struct argp_child children[] = ...@@ -117,6 +120,7 @@ static const struct argp_child children[] =
typedef spot::tgba_digraph::graph_t::trans_storage_t tr_t; typedef spot::tgba_digraph::graph_t::trans_storage_t tr_t;
typedef std::set<std::vector<tr_t>> unique_aut_t; typedef std::set<std::vector<tr_t>> unique_aut_t;
static enum output_format { Dot, Lbtt, Lbtt_t, Spin, Hoa } format = Dot; static enum output_format { Dot, Lbtt, Lbtt_t, Spin, Hoa } format = Dot;
const char* opt_dot = nullptr;
static const char* hoa_opt = 0; static const char* hoa_opt = 0;
static spot::ltl::atomic_prop_set aprops; static spot::ltl::atomic_prop_set aprops;
static bool ap_count_given = false; static bool ap_count_given = false;
...@@ -210,6 +214,7 @@ parse_opt(int key, char* arg, struct argp_state* as) ...@@ -210,6 +214,7 @@ parse_opt(int key, char* arg, struct argp_state* as)
break; break;
case OPT_DOT: case OPT_DOT:
format = Dot; format = Dot;
opt_dot = arg;
break; break;
case OPT_LBTT: case OPT_LBTT:
if (arg) if (arg)
...@@ -318,7 +323,7 @@ main(int argc, char** argv) ...@@ -318,7 +323,7 @@ main(int argc, char** argv)
switch (format) switch (format)
{ {
case Dot: case Dot:
spot::dotty_reachable(std::cout, aut, is_ba); spot::dotty_reachable(std::cout, aut, is_ba, opt_dot);
break; break;
case Lbtt: case Lbtt:
spot::lbtt_reachable(std::cout, aut, is_ba); spot::lbtt_reachable(std::cout, aut, is_ba);
......
...@@ -34,7 +34,8 @@ run 0 ../tgbagraph | tee stdout ...@@ -34,7 +34,8 @@ run 0 ../tgbagraph | tee stdout
cat >expected <<EOF cat >expected <<EOF
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 1 [label="0"] 1 -> 1 [label="0"]
...@@ -48,7 +49,8 @@ digraph G { ...@@ -48,7 +49,8 @@ digraph G {
3 -> 3 [label="1\n{0,1}"] 3 -> 3 [label="1\n{0,1}"]
} }
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 1 [label="0"] 1 -> 1 [label="0"]
...@@ -60,7 +62,8 @@ digraph G { ...@@ -60,7 +62,8 @@ digraph G {
3 -> 1 [label="p1 | p2\n{0,1}"] 3 -> 1 [label="p1 | p2\n{0,1}"]
} }
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 1 [label="0"] 1 -> 1 [label="0"]
...@@ -71,7 +74,8 @@ digraph G { ...@@ -71,7 +74,8 @@ digraph G {
3 [label="2"] 3 [label="2"]
} }
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 1 [label="0"] 1 -> 1 [label="0"]
...@@ -85,7 +89,8 @@ digraph G { ...@@ -85,7 +89,8 @@ digraph G {
3 -> 1 [label="1\n{0,1}"] 3 -> 1 [label="1\n{0,1}"]
} }
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 2 [label="p1"] 1 -> 2 [label="p1"]
...@@ -97,7 +102,8 @@ digraph G { ...@@ -97,7 +102,8 @@ digraph G {
3 -> 2 [label="!p1 | p2"] 3 -> 2 [label="!p1 | p2"]
} }
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 2 [label="p1"] 1 -> 2 [label="p1"]
...@@ -111,4 +117,3 @@ digraph G { ...@@ -111,4 +117,3 @@ digraph G {
EOF EOF
diff stdout expected diff stdout expected
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <ostream> #include <ostream>
#include <stdexcept>
#include "tgba/tgbagraph.hh" #include "tgba/tgbagraph.hh"
#include "dotty.hh" #include "dotty.hh"
#include "dottydec.hh" #include "dottydec.hh"
...@@ -38,19 +39,53 @@ namespace spot ...@@ -38,19 +39,53 @@ namespace spot
{ {
public: public:
dotty_bfs(std::ostream& os, const_tgba_ptr a, bool mark_accepting_states, dotty_bfs(std::ostream& os, const_tgba_ptr a, bool mark_accepting_states,
dotty_decorator* dd) const char* options, dotty_decorator* dd)
: tgba_reachable_iterator_breadth_first(a), os_(os), : tgba_reachable_iterator_breadth_first(a), os_(os),
mark_accepting_states_(mark_accepting_states), dd_(dd), mark_accepting_states_(mark_accepting_states), dd_(dd),
sba_(std::dynamic_pointer_cast<const tgba_digraph>(a)) sba_(std::dynamic_pointer_cast<const tgba_digraph>(a))
{ {
if (options)
while (char c = *options++)
switch (c)
{
case 'c':
opt_circles = true;
break;
case 'h':
opt_horizontal = true;
break;
case 'n':
opt_name = true;
break;
case 'N':
opt_name = false;
break;
case 'v':
opt_horizontal = false;
break;
case 't':
mark_accepting_states_ = false;
break;
default:
throw std::runtime_error
(std::string("unknown option for dotty(): ") + c);
}
} }
void void
start() start()
{ {
os_ << ("digraph G {\n" os_ << "digraph G {\n";
" 0 [label=\"\", style=invis, height=0]\n" if (opt_horizontal)
" 0 -> 1\n"); os_ << " rankdir=LR\n";
if (opt_name)
if (auto n = aut_->get_named_prop<std::string>("automaton-name"))
escape_str(os_ << " label=\"", *n) << "\"\n labelloc=\"t\"\n";
if (opt_circles)
os_ << " node [shape=\"circle\"]\n";
os_ << " 0 [label=\"\", style=invis, ";
os_ << (opt_horizontal ? "width" : "height");
os_ << "=0]\n 0 -> 1\n";
} }
void void
...@@ -96,12 +131,12 @@ namespace spot ...@@ -96,12 +131,12 @@ namespace spot
std::string label = std::string label =
bdd_format_formula(aut_->get_dict(), bdd_format_formula(aut_->get_dict(),
si->current_condition()); si->current_condition());
auto a = si->current_acceptance_conditions(); if (!mark_accepting_states_)
if (a) if (auto a = si->current_acceptance_conditions())
{ {
label += "\n"; label += "\n";
label += aut_->acc().format(a); label += aut_->acc().format(a);
} }
std::string s = aut_->transition_annotation(si); std::string s = aut_->transition_annotation(si);
if (!s.empty()) if (!s.empty())
...@@ -122,16 +157,20 @@ namespace spot ...@@ -122,16 +157,20 @@ namespace spot
bool mark_accepting_states_; bool mark_accepting_states_;
dotty_decorator* dd_; dotty_decorator* dd_;
const_tgba_digraph_ptr sba_; const_tgba_digraph_ptr sba_;
bool opt_horizontal = true;
bool opt_name = true;
bool opt_circles = false;
}; };
} }
std::ostream& std::ostream&
dotty_reachable(std::ostream& os, const const_tgba_ptr& g, dotty_reachable(std::ostream& os, const const_tgba_ptr& g,
bool assume_sba, dotty_decorator* dd) bool assume_sba, const char* options,
dotty_decorator* dd)
{ {
if (!dd) if (!dd)
dd = dotty_decorator::instance(); dd = dotty_decorator::instance();
dotty_bfs d(os, g, assume_sba || g->has_state_based_acc(), dd); dotty_bfs d(os, g, assume_sba || g->has_state_based_acc(), options, dd);
d.run(); d.run();
return os; return os;
} }
......
...@@ -41,12 +41,18 @@ namespace spot ...@@ -41,12 +41,18 @@ namespace spot
/// ways. See \ref tgba_dotty "this page" for a list of available /// ways. See \ref tgba_dotty "this page" for a list of available
/// decorators. If no decorator is specified, the dotty_decorator /// decorators. If no decorator is specified, the dotty_decorator
/// is used. /// is used.
/// labels the transitions are encoded in UTF-8. ///
/// \param options an optional string of letters, each indicating a
/// different option. Presently the following options are
/// supported: 'v' for vertical output, 'h' for horizontal output,
/// 't' force transition-based acceptance, 'N' hide the name of the
/// automaton, 'n' shows the name, 'c' uses circle-shaped states.
SPOT_API std::ostream& SPOT_API std::ostream&
dotty_reachable(std::ostream& os, dotty_reachable(std::ostream& os,
const const_tgba_ptr& g, const const_tgba_ptr& g,
bool assume_sba = false, bool assume_sba = false,
dotty_decorator* dd = 0); const char* options = nullptr,
dotty_decorator* dd = nullptr);
} }
#endif // SPOT_TGBAALGOS_DOTTY_HH #endif // SPOT_TGBAALGOS_DOTTY_HH
...@@ -118,7 +118,8 @@ run 0 ../../bin/autfilt -q --are-isomorph ex.hoa out.hoa ...@@ -118,7 +118,8 @@ run 0 ../../bin/autfilt -q --are-isomorph ex.hoa out.hoa
run 0 ../ltl2tgba -x -DC 'GFa & XGFb' > out.tgba run 0 ../ltl2tgba -x -DC 'GFa & XGFb' > out.tgba
cat >ex.tgba <<EOF cat >ex.tgba <<EOF
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 2 [label="1"] 1 -> 2 [label="1"]
...@@ -127,9 +128,9 @@ digraph G { ...@@ -127,9 +128,9 @@ digraph G {
2 -> 3 [label="!a"] 2 -> 3 [label="!a"]
2 -> 4 [label="!b"] 2 -> 4 [label="!b"]
3 [label="3", peripheries=2] 3 [label="3", peripheries=2]
3 -> 3 [label="!a\n{0}"] 3 -> 3 [label="!a"]
4 [label="4", peripheries=2] 4 [label="4", peripheries=2]
4 -> 4 [label="!b\n{0}"] 4 -> 4 [label="!b"]
} }
EOF EOF
diff out.tgba ex.tgba diff out.tgba ex.tgba
...@@ -60,7 +60,8 @@ run 0 ../ltl2tgba -XD dra.dstar | tee stdout ...@@ -60,7 +60,8 @@ run 0 ../ltl2tgba -XD dra.dstar | tee stdout
cat >expected <<EOF cat >expected <<EOF
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 1 [label="a & !b"] 1 -> 1 [label="a & !b"]
...@@ -80,13 +81,14 @@ run 0 ../ltl2tgba -XDD dra.dstar | tee stdout ...@@ -80,13 +81,14 @@ run 0 ../ltl2tgba -XDD dra.dstar | tee stdout
cat >expected <<EOF cat >expected <<EOF
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 1 [label="a & !b"] 1 -> 1 [label="a & !b"]
1 -> 2 [label="b"] 1 -> 2 [label="b"]
2 [label="1", peripheries=2] 2 [label="1", peripheries=2]
2 -> 2 [label="1\n{0}"] 2 -> 2 [label="1"]
} }
EOF EOF
...@@ -123,7 +125,8 @@ run 0 ../ltl2tgba -XDB dsa.dstar | tee stdout ...@@ -123,7 +125,8 @@ run 0 ../ltl2tgba -XDB dsa.dstar | tee stdout
cat >expected <<EOF cat >expected <<EOF
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 2 [label="1"] 1 -> 2 [label="1"]
...@@ -211,7 +214,8 @@ run 0 ../ltl2tgba -XDD dra.dstar | tee stdout ...@@ -211,7 +214,8 @@ run 0 ../ltl2tgba -XDD dra.dstar | tee stdout
cat >expected <<EOF cat >expected <<EOF
digraph G { digraph G {
0 [label="", style=invis, height=0] rankdir=LR
0 [label="", style=invis, width=0]
0 -> 1 0 -> 1
1 [label="0"] 1 [label="0"]
1 -> 2 [label="!a & !b"] 1 -> 2 [label="!a & !b"]
...@@ -222,15 +226,15 @@ digraph G { ...@@ -222,15 +226,15 @@ digraph G {
2 -> 2 [label="!b"] 2 -> 2 [label="!b"]
2 -> 4 [label="b"] 2 -> 4 [label="b"]
3 [label="2", peripheries=2] 3 [label="2", peripheries=2]