FROM	StdParts.Misc	IMPORT $BDTFF, $SLatch, $Sink
FROM	StdParts.Gates	IMPORT $SGate1, $SGate2, $SGate3, $SGate4
FROM	StdParts.PLAs	IMPORT $PLA
FROM	iomd.mousec	IMPORT $mousec

CONST MOUSEPLA = "iomd/pla/mousepla"

BLOCK MOUSE(
 {IN} rclk,
 {IN} mousex[1:0],
 {IN} mousey[1:0],
 {IN} mousereg,
 {IN} lwrite,
 {IN} progstrb,
 {IN} la2,
 {IO} d[15:0])

 s1ffx	= $BDTFF(rclk, mousex[1:0], Vdd, Vdd) => (sxi[1:0], Nsxi[1:0])
          WITH (delay=ns_5, edge=-ve)
  
 s1ffy  = $BDTFF(rclk, mousey[1:0], Vdd, Vdd) => (syi[1:0], Nsyi[1:0])
          WITH (delay=ns_5, edge=-ve)

 s2ffx	= $BDTFF(rclk, sxi[1:0], Vdd, Vdd) => (sx[1:0], Nsx[1:0])
          WITH (delay=ns_5, edge=-ve)
  
 s2ffy	= $BDTFF(rclk, syi[1:0], Vdd, Vdd) => (sy[1:0], Nsy[1:0])
          WITH (delay=ns_5, edge=-ve)

 dffx 	= $BDTFF(dclk, sx[1:0], Vdd, Vdd) => (dsx[1:0], Ndsx[1:0])
          WITH (delay=ns_5, edge=-ve)
  
 dffy 	= $BDTFF(dclk, sy[1:0], Vdd, Vdd) => (dsy[1:0], Ndsy[1:0])
          WITH (delay=ns_5, edge=-ve)

 mri	= $SGate1(mousereg) => (Nmousereg) WITH (op=INV, delay=ns_1)
 dcg    = $SGate2(Nmousereg, rclk) => dclk WITH (op=AND, delay=ns_2)

 la2inv	= $SGate1(la2) => Nla2 WITH (op=INV, delay=ns_1)
 lwinv	= $SGate1(lwrite) => lread WITH (op=INV, delay=ns_1)

 wrxg   = $SGate4(lwrite, Nla2, mousereg, progstrb) => writex 
          WITH (op=AND, delay=ns_3)

 wryg	= $SGate4(lwrite, la2, mousereg, progstrb)  => writey 
          WITH (op=AND, delay=ns_3)

 rdxg	= $SGate4(lread, Nla2, mousereg, progstrb)  => readx 
          WITH (op=AND, delay=ns_3)

 rdyg   = $SGate4(lread, la2, mousereg, progstrb)   => ready
          WITH (op=AND, delay=ns_3)
 
 cplax	= $PLA(Vdd, Vdd, inx(dsx[1], dsx[0], sx[1], sx[0]))
        => (outx(countenx, upndownx)) WITH (delay=ns_5, filename=MOUSEPLA)

 cplay	= $PLA(Vdd, Vdd, iny(dsy[1], dsy[0], sy[1], sy[0]))
        => (outy(counteny, upndowny)) WITH (delay=ns_5, filename=MOUSEPLA)

 ckmagx	= $SGate3(Nmousereg, countenx, dclk) => clkx WITH (op=AND, delay=ns_1)

 ckmagy	= $SGate3(Nmousereg, counteny, dclk) => clky WITH (op=AND, delay=ns_1)

 mscx   = $MOUSEC(
  {IN} clkx,
  {IN} upndownx,
  {IN} writex,
  {IN} readx,
  {IO} d[15:0]) WITH (delay=ns_10)

 mscy   = $MOUSEC(
  {IN} clky,
  {IN} upndowny,
  {IN} writey,
  {IN} ready,
  {IO} d[15:0]) WITH (delay=ns_10)

 sink = $Sink(junk(Nsxi[1:0], Nsyi[1:0], Nsx[1:0], Nsy[1:0], 
                   Ndsx[1:0], Ndsy[1:0]))

END {MOUSE}
