I'd like to implement the following mockup with dot:

mockup to be implemented in dot

So far I've got this much:

digraph G {
graph [rankdir = LR, splines=ortho]

  unit [shape=box, width = 2, height = 10];

  more_different_unit [shape=box, height=4];
  other_unit [shape=box, height=4];


  unit -> other_unit [label = "foo"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
}

I compile it like so:

dot -Gsplines=none test.gv | neato -n -Gsplines=ortho -Tpng -otest.png

That gets me close, but there are a few things I'd like to know.

  1. How can I get blocks to the left and right of Foo, not just the right? I haven't been able to figure that out yet.

  2. Is it possible to put the edge labels consistently above or under the edge?

  3. How can I align the right-hand nodes left, and the left-hand nodes right? One possibility would be to make them the same width, which would be okay.

Thanks!!

UPDATE:

Based on the accepted answer, I am now doing the following which is precisely what I needed, again generated through dot piped to neato, as mentioned above:

digraph G {
    graph [rankdir = LR, splines=ortho];

    node[shape=record];
    Bar[label="Bar", height=2];
    Foo[label="Foo", height=4];

    Bew[label="Bew", height=2];
    Gate[label="Gate", height=2];

    Bar -> Foo [label="Bar2Foo
Edit
Report