# vl2mv ping_pong_new.v # version: 0.2 # date: 11:17:06 12/11/95 (PST) .model ping_pong # I/O ports .mv state_ball_2 3 TO_A TO_B OUT_OF_PLAY .mv state_ball_1 3 TO_A TO_B OUT_OF_PLAY .mv action_A 2 HIT IDLE .mv state_B 3 HIT WAIT_GOING WAIT_COMING .mv action_B 2 HIT IDLE .mv state_A 3 HIT WAIT_GOING WAIT_COMING .subckt player player_A opponent=action_B out=action_A state=state_A .subckt player player_B opponent=action_A out=action_B state=state_B .mv _n0 3 TO_A TO_B OUT_OF_PLAY .names _n0 TO_A .subckt ball ball_1 action_A=action_A action_B=action_B state=state_ball_1 init=_n0 .mv _n1 3 TO_A TO_B OUT_OF_PLAY .names _n1 TO_B .subckt ball ball_2 action_A=action_A action_B=action_B state=state_ball_2 init=_n1 # conflict arbitrators # non-blocking assignments # latches # quasi-continuous assignment .end .model player # I/O ports .outputs out .outputs state .inputs opponent .mv out 2 HIT IDLE .mv r_state 3 HIT WAIT_GOING WAIT_COMING .mv state 3 HIT WAIT_GOING WAIT_COMING .mv opponent 2 HIT IDLE # assign out = (state == 0) ? 0 : 1 .mv out$raw_n2 2 HIT IDLE .mv _n4 3 HIT WAIT_GOING WAIT_COMING .names _n4 HIT # state == 0 .names state _n4 _n3 .def 0 - =state 1 .mv _n5 2 HIT IDLE .names _n5 HIT .mv _n6 2 HIT IDLE .names _n6 IDLE # (state == 0) ? 0 : 1 .mv _n7 2 HIT IDLE .names _n5 _n6 _n3 _n7 - - 0 =_n6 - - 1 =_n5 .names _n7 out$raw_n2 - =_n7 # assign r_state = $NDset ( 2,0 ) .names r_state WAIT_COMING HIT # state = 0 .mv state$raw_na 3 HIT WAIT_GOING WAIT_COMING .names state$raw_na HIT # non-blocking assignments for initial .mv _nd 3 HIT WAIT_GOING WAIT_COMING .names _nd HIT .names state _nd _nc .def 0 - =state 1 .names _nc _nb 1 1 0 0 .mv _nf 2 HIT IDLE .names _nf IDLE # opponent == 1 .names opponent _nf _ne .def 0 - =opponent 1 .names _ne _n10 - =_ne # state = 1 .mv state$_ne_n11$true 3 HIT WAIT_GOING WAIT_COMING .names state$_ne_n11$true WAIT_GOING .mv _n13 2 HIT IDLE .names _n13 HIT # opponent == 0 .names opponent _n13 _n12 .def 0 - =opponent 1 .names _n12 _n14 - =_n12 # state = 2 .mv state$_n12_n15$true 3 HIT WAIT_GOING WAIT_COMING .names state$_n12_n15$true WAIT_COMING # if/else (opponent == 0) .mv state$_n12$raw_n18 3 HIT WAIT_GOING WAIT_COMING .names state$_n12_n15$true state _n12 state$_n12$raw_n18 - - 0 =state - - 1 =state$_n12_n15$true # if/else (opponent == 1) .mv state$_ne$raw_n1a 3 HIT WAIT_GOING WAIT_COMING .names state$_ne_n11$true state$_n12$raw_n18 _ne state$_ne$raw_n1a - - 0 =state$_n12$raw_n18 - - 1 =state$_ne_n11$true .mv _n1f 3 HIT WAIT_GOING WAIT_COMING .names _n1f WAIT_GOING .names state _n1f _n1e .def 0 - =state 1 .names _n1e _n1d 1 1 0 0 .mv _n21 2 HIT IDLE .names _n21 HIT # opponent == 0 .names opponent _n21 _n20 .def 0 - =opponent 1 .names _n20 _n22 - =_n20 # state = 2 .mv state$_n20_n23$true 3 HIT WAIT_GOING WAIT_COMING .names state$_n20_n23$true WAIT_COMING # if/else (opponent == 0) .mv state$_n20$raw_n26 3 HIT WAIT_GOING WAIT_COMING .names state$_n20_n23$true state _n20 state$_n20$raw_n26 - - 0 =state - - 1 =state$_n20_n23$true .mv _n29 3 HIT WAIT_GOING WAIT_COMING .names _n29 WAIT_COMING .names state _n29 _n28 .def 0 - =state 1 .names _n28 _n27 1 1 0 0 # state = r_state .mv state$_n27_n2a$true 3 HIT WAIT_GOING WAIT_COMING .names r_state state$_n27_n2a$true - =r_state # case (state ) .mv state$_n27$raw_n2d 3 HIT WAIT_GOING WAIT_COMING .names state$_n27_n2a$true state _n27 state$_n27$raw_n2d - - 0 =state - - 1 =state$_n27_n2a$true .mv state$_n1d$raw_n2f 3 HIT WAIT_GOING WAIT_COMING .names state$_n20$raw_n26 state$_n27$raw_n2d _n1d state$_n1d$raw_n2f - - 0 =state$_n27$raw_n2d - - 1 =state$_n20$raw_n26 .mv state$_nb$raw_n33 3 HIT WAIT_GOING WAIT_COMING .names state$_ne$raw_n1a state$_n1d$raw_n2f _nb state$_nb$raw_n33 - - 0 =state$_n1d$raw_n2f - - 1 =state$_ne$raw_n1a # conflict arbitrators .names out$raw_n2 out - =out$raw_n2 .names _nb _n10 _n14 _n1d _n22 _n27 _n36 .def 0 1 1 - - - - 1 1 0 1 - - - 1 0 - - 1 1 - 1 0 - - 0 - 1 1 .mv _n37 3 HIT WAIT_GOING WAIT_COMING .names _n36 state$_nb$raw_n33 state _n37 1 - - =state$_nb$raw_n33 0 - - =state # non-blocking assignments # latches .r state$raw_na state - =state$raw_na .latch _n37 state # quasi-continuous assignment .end .model ball # I/O ports .inputs action_A .inputs action_B .outputs state .inputs init .mv action_A 2 HIT IDLE .mv action_B 2 HIT IDLE .mv state 3 TO_A TO_B OUT_OF_PLAY .mv init 3 TO_A TO_B OUT_OF_PLAY # state = init .mv state$raw_n3c 3 TO_A TO_B OUT_OF_PLAY .names init state$raw_n3c - =init # non-blocking assignments for initial .mv _n3f 3 TO_A TO_B OUT_OF_PLAY .names _n3f TO_A .names state _n3f _n3e .def 0 - =state 1 .names _n3e _n3d 1 1 0 0 .mv _n41 2 HIT IDLE .names _n41 HIT # action_A == 0 .names action_A _n41 _n40 .def 0 - =action_A 1 .names _n40 _n42 - =_n40 # state = 1 .mv state$_n40_n43$true 3 TO_A TO_B OUT_OF_PLAY .names state$_n40_n43$true TO_B .mv _n45 2 HIT IDLE .names _n45 IDLE # action_A == 1 .names action_A _n45 _n44 .def 0 - =action_A 1 .mv _n47 2 HIT IDLE .names _n47 HIT # action_B == 0 .names action_B _n47 _n46 .def 0 - =action_B 1 # (action_A == 1) && (action_B == 0) .names _n44 _n46 _n48 .def 0 1 1 1 .names _n48 _n49 - =_n48 # state = 2 .mv state$_n48_n4a$true 3 TO_A TO_B OUT_OF_PLAY .names state$_n48_n4a$true OUT_OF_PLAY # if/else ((action_A == 1) && (action_B == 0)) .mv state$_n48$raw_n4d 3 TO_A TO_B OUT_OF_PLAY .names state$_n48_n4a$true state _n48 state$_n48$raw_n4d - - 0 =state - - 1 =state$_n48_n4a$true # if/else (action_A == 0) .mv state$_n40$raw_n4f 3 TO_A TO_B OUT_OF_PLAY .names state$_n40_n43$true state$_n48$raw_n4d _n40 state$_n40$raw_n4f - - 0 =state$_n48$raw_n4d - - 1 =state$_n40_n43$true .mv _n54 3 TO_A TO_B OUT_OF_PLAY .names _n54 TO_B .names state _n54 _n53 .def 0 - =state 1 .names _n53 _n52 1 1 0 0 .mv _n56 2 HIT IDLE .names _n56 HIT # action_B == 0 .names action_B _n56 _n55 .def 0 - =action_B 1 .names _n55 _n57 - =_n55 # state = 0 .mv state$_n55_n58$true 3 TO_A TO_B OUT_OF_PLAY .names state$_n55_n58$true TO_A .mv _n5a 2 HIT IDLE .names _n5a IDLE # action_B == 1 .names action_B _n5a _n59 .def 0 - =action_B 1 .mv _n5c 2 HIT IDLE .names _n5c HIT # action_A == 0 .names action_A _n5c _n5b .def 0 - =action_A 1 # (action_B == 1) && (action_A == 0) .names _n59 _n5b _n5d .def 0 1 1 1 .names _n5d _n5e - =_n5d # state = 2 .mv state$_n5d_n5f$true 3 TO_A TO_B OUT_OF_PLAY .names state$_n5d_n5f$true OUT_OF_PLAY # if/else ((action_B == 1) && (action_A == 0)) .mv state$_n5d$raw_n62 3 TO_A TO_B OUT_OF_PLAY .names state$_n5d_n5f$true state _n5d state$_n5d$raw_n62 - - 0 =state - - 1 =state$_n5d_n5f$true # if/else (action_B == 0) .mv state$_n55$raw_n64 3 TO_A TO_B OUT_OF_PLAY .names state$_n55_n58$true state$_n5d$raw_n62 _n55 state$_n55$raw_n64 - - 0 =state$_n5d$raw_n62 - - 1 =state$_n55_n58$true .mv _n69 3 TO_A TO_B OUT_OF_PLAY .names _n69 OUT_OF_PLAY .names state _n69 _n68 .def 0 - =state 1 .names _n68 _n67 1 1 0 0 # state = 2 .mv state$_n67_n6a$true 3 TO_A TO_B OUT_OF_PLAY .names state$_n67_n6a$true OUT_OF_PLAY # case (state ) .mv state$_n67$raw_n6d 3 TO_A TO_B OUT_OF_PLAY .names state$_n67_n6a$true state _n67 state$_n67$raw_n6d - - 0 =state - - 1 =state$_n67_n6a$true .mv state$_n52$raw_n6f 3 TO_A TO_B OUT_OF_PLAY .names state$_n55$raw_n64 state$_n67$raw_n6d _n52 state$_n52$raw_n6f - - 0 =state$_n67$raw_n6d - - 1 =state$_n55$raw_n64 .mv state$_n3d$raw_n73 3 TO_A TO_B OUT_OF_PLAY .names state$_n40$raw_n4f state$_n52$raw_n6f _n3d state$_n3d$raw_n73 - - 0 =state$_n52$raw_n6f - - 1 =state$_n40$raw_n4f # conflict arbitrators .names _n3d _n42 _n49 _n52 _n57 _n5e _n67 _n76 .def 0 1 1 - - - - - 1 1 0 1 - - - - 1 0 - - 1 1 - - 1 0 - - 1 0 1 - 1 0 - - 0 - - 1 1 .mv _n77 3 TO_A TO_B OUT_OF_PLAY .names _n76 state$_n3d$raw_n73 state _n77 1 - - =state$_n3d$raw_n73 0 - - =state # non-blocking assignments # latches .r state$raw_n3c state - =state$raw_n3c .latch _n77 state # quasi-continuous assignment .end