A Game of Othello Othello: popular board game (often known as Reversi) 8x8 board, black and white tokens Today, we will use it as a design example CS 150 – Spring 2008 – Lec #22: Othello Design Example - 1 Othello: Rules and Game Play The object of the game is to have the majority of your colour discs on the board at the end of the game Rules Black places two black discs and White places two white discs as shown in here. The game always begins with this setup. A move consists of "outflanking" your opponent's disc(s), then flipping the outflanked disc(s) to your colour. To outflank means to place a disc on the board so that your opponent's row (or rows) of disc(s) is bordered at each end by a disc of your colour. (A "row" may be made up of one or more discs). Here's one example: White disc A was already in place on the board. The placement of white disc B outflanks the row of three black discs. CS 150 – Spring 2008 – Lec #22: Othello Design Example - 2 Outflanking Example White disc A was already in place on the board. The placement of white disc B outflanks the row of three black discs. White flips the outflanked discs and now the row looks like this: CS 150 – Spring 2008 – Lec #22: Othello Design Example - 3 Rules Black always moves first. If on your turn you cannot outflank and flip at least one opposing disc, your turn is forfeited and your opponent moves again. However, if a move is available to you, you may not forfeit your turn. A disc may outflank any number of discs in one or more rows in any number of directions at the same time - horizontally, vertically or diagonally. You may not skip over your own color disc to outflank an opposing disc. CS 150 – Spring 2008 – Lec #22: Othello Design Example - 4 Rules Discs may only be outflanked as a direct result of a move and must fall in the direct line of the disc placed down. All discs outflanked in any one move must be flipped, even if it is to the player's advantage not to flip them at all. Once a disc is placed on a square, it can never be moved to another square later in the game. CS 150 – Spring 2008 – Lec #22: Othello Design Example - 5 Rules When it is no longer possible for either player to move, the game is over. Discs are counted and the player with the majority of his or her colour discs on the board is the winner. CS 150 – Spring 2008 – Lec #22: Othello Design Example - 6 Our Design Problem Design an Othello Board and Gamekeeper. The gamekeeper will Keep track of the score and state of the board Indicate whose move it is Indicate where legal moves can be made Accept and make a legal move Flip all the discs who have been outflanked Focus of today’s lecture Game engine and logic alone We will assume Display device for an 8x8 board Input device which tells us where to move on an 8x8 board CS 150 – Spring 2008 – Lec #22: Othello Design Example - 7 Global Picture of Our System Circuit in Each Square to: 1. Keep State of the Square 2. Compute whether move in square is legal Game Controller 1. Global Game State 2. Orchestrates individual move logic CS 150 – Spring 2008 – Lec #22: Othello Design Example - 8 Game Controller State Machine Flip Current Color N Legal Move? Current Color = White Game Over Flip Current Color Legal Move? Y N Y Update Board Move selected Enable Move Move selected’ CS 150 – Spring 2008 – Lec #22: Othello Design Example - 9 Square FSM Basic Functions Store state of square (Empty, White, Black) Report when move is legal Report when user moves into square Update state of square in response to a move Current Color Move Enabled Square Move Selected Legal Move CS 150 – Spring 2008 – Lec #22: Othello Design Example - 10 Square Finite State Machine sta lac te= b t Se k State=none ite Se t sta wh te= Flip white State=black State=white Flip black Finite State Machine (Macro) per Othello Square CS 150 – Spring 2008 – Lec #22: Othello Design Example - 11 What’s a Legal Move? Decided in each square Square state must be empty “Run” of colors Straight line of squares of one color bordered by a square of the other color White run: line of white squares terminated by black square Black run: line of black squares terminated by white square Current run: line of squares of current color terminated by square of other color Legal move Square is empty and neighbor square is part of current run CS 150 – Spring 2008 – Lec #22: Othello Design Example - 12 Key Consideration for Cell Is it on a “run” in any direction? Originates a white (black) run: Cell is white (black); and Neighbor in direction is black (white); Continues a white (black) run Cell is white (black); and Neighbor in direction continues or originates a white (black) run Move to a square is legal if and only if Current Mover is white (black) Current State is empty Some neighbor continues or orginates a black (white) run CS 150 – Spring 2008 – Lec #22: Othello Design Example - 13 Originating and Continuing a Run Begins a black run Continues a white run Begins a white run CS 150 – Spring 2008 – Lec #22: Othello Design Example - 14 Legal Moves Legal to move white Legal to move black How do we build a circuit to pick this up? CS 150 – Spring 2008 – Lec #22: Othello Design Example - 15 Two Functions Per Color and direction Remote Black: this square is white all the squares in some direction are white until we hit a black Reverse black/white for Remote White RemoteOrLocal Black: this square is black OR remoteBlack is true for this square Note that if a square is empty both remote and remoteOrLocal are false. CS 150 – Spring 2008 – Lec #22: Othello Design Example - 16 Originating and Continuing a Run remoteWhiteEast remoteOrLocalBlack (all directions) remoteOrLocalBlack East remoteOrLocalWhite (all directions) remoteOrLocalBlackWest remoteBlackWest remoteOrLocalWhite (all directions) remoteOrLocalBlackWest remoteBlackWest CS 150 – Spring 2008 – Lec #22: Othello Design Example - 17 Cell circuit picture NW Neighbor North Neighbor NE Neighbor West Neighbor Othello Cell East Neighbor SW Neighbor South Neighbor SE Neighbor Local Inputs and Outputs (Connections to Adjoining cells) Cell has remote black Cell has remote white Cell has localOrRemote black Cell has localOrRemote white Flip black Flip white Global Outputs Cell color (black, white, none) Legal to move to current color CS 150 – Spring 2008 – Lec #22: Othello Design Example - 18 RemoteBlack (Continue White Run) Cell Color = white SE Neighbor localOrRemote black Remote black to (NW neighbor) Computation of remote (8x2, one to each neighbor x one per color) White run to NW White run from SE CS 150 – Spring 2008 – Lec #22: Othello Design Example - 19 RemoteOrLocal black (on white run or neighbor can start white run) Cell Color = black remoteBlack local orRemoteblack to (NW neighbor) Computation of localOrRemote (8x2, one to each neighbor x one per color) CS 150 – Spring 2008 – Lec #22: Othello Design Example - 20 Cell circuit picture On each link: 2 wires in 4 wires out NW Neighbor West Neighbor North Neighbor Othello Cell NE Neighbor East Neighbor Local Inputs and Outputs (Connections to Adjoining cells) Cell has remote black Cell has remote white Cell has localOrRemote black Cell has localOrRemote white Flip black Flip white Global Outputs SW Neighbor South Neighbor SE Neighbor Cell color (black, white, none) Legal to move to current color CS 150 – Spring 2008 – Lec #22: Othello Design Example - 21 Legal Move Move to a square is legal if and only if Current Mover is white (black) Current State is empty Some neighbor continues or orginates a black (white) run Translate into our circuit Current Mover is white (black) Current State is empty For some direction: neighbor’s remoteWhite (black) CS 150 – Spring 2008 – Lec #22: Othello Design Example - 22 Computation of Legal Current Mover = black NW remote black Current Mover = white NW remote white 8 inputs, one per neighbor Cell color = none legal Computation of legal Computation from one direction Replicate here from each neighbor CS 150 – Spring 2008 – Lec #22: Othello Design Example - 23 What’s the delay? Worst case is on edge or corner At most 7 AND or OR gates on remote chain Computation of legal is ~6 gates (figure 3 gate delays for 8input OR) Total delay is 13 gates Note (Synchronous Mealy) we want to latch the output of legal! What about the edges and corners? More later… CS 150 – Spring 2008 – Lec #22: Othello Design Example - 24 How much logic in a cell? 8x2 AND gates for remote = 16 8x2 OR gates for localOrRemote = 16 3 gates for leaf of legal computation (8 leaves), so 8x3 = 24 7 OR gates + 1 AND gate for rest of legal computation Total 64 gates/cell (so far) Also need at least 2 latches for color + one for legal More logic to come CS 150 – Spring 2008 – Lec #22: Othello Design Example - 25 Doing The Move This is easy One external select (keyed by button or multiplexer from joystick – not our problem today) Select & legal (previously computed) Still have to flip… CS 150 – Spring 2008 – Lec #22: Othello Design Example - 26 Flipping Move Flip How can we build a flip function? CS 150 – Spring 2008 – Lec #22: Othello Design Example - 27 Flipping Move = black RemoteBlackNorth = True RemoteBlackEast = True Square selected CS 150 – Spring 2008 – Lec #22: Othello Design Example - 28 Key Mover sends out a flip signal, with color and direction, to each neighbor 8x2 wires Flip black if Flip black signal from one direction (SE); and Color is white; and remoteBlack is true in other direction (NW) FlipBlackNW = [FlipBlackFromSE AND Color=white AND RemoteBlackNW Send FlipBlackNW out to NW neighbor OR all FlipBackDirections to get Direction CS 150 – Spring 2008 – Lec #22: Othello Design Example - 29 Flip Calculation SE Flip black NW Remote black Cell color = white Flip black to NW Neighbor Move Cell mover = black Computation of flip (8x2, one per neighbor x one per color) CS 150 – Spring 2008 – Lec #22: Othello Design Example - 30 Computation of Next Cell State Current Mover=black Move Flip black to each neighbor Next state = black (repeat for white) CS 150 – Spring 2008 – Lec #22: Othello Design Example - 31 Cell circuit picture On each link: 4 wires in 6 wires out NW Neighbor West Neighbor North Neighbor Othello Cell NE Neighbor East Neighbor Local Inputs and Outputs (Connections to Adjoining cells) Cell has remote black Cell has remote white Cell has localOrRemote black Cell has localOrRemote white Flip black Flip white Global Outputs SW Neighbor South Neighbor SE Neighbor Cell color (black, white, none) Legal to move to current color CS 150 – Spring 2008 – Lec #22: Othello Design Example - 32 Gate Delay Calculation for Clip 7x2 gates to propagate = 14 gate delays But need to consider the remote chain! Adds another 7 delays (from slide 24) 3 gate delays through 8-way OR + 1 gate delay to comput next state Worst-case is 25 gate delays Can reduce to 18 by latching remote signals computed in legal-move phase CS 150 – Spring 2008 – Lec #22: Othello Design Example - 33 How Many Gates 2 gates/direction-color x 2 colors x 8 directions = 32 gates 2 gates for current move (one black, one white) 8 gates/color for upper end of next-state tree = 16 Total 50 gates Add to 64 from slide 25 Total 114 gates/cell 64 cells = 7296 gates for design But what about the corners and edges? CS 150 – Spring 2008 – Lec #22: Othello Design Example - 34 Two choices Cell design assumes neighbors in all directions Note true at edges and corners One: special-case cells on the edge Now have 9 different types of cell! 1/49 cells in center of board (type 1) – cell we’ve designed 4/7 cells each on each edge (types 2-5) 4/7 cells each for each corner (types 6-9) Note each specialty type is simpler than general case, but… 9 cell types to design! Two: Surround the board with shadow squares Less efficient, but much simpler CS 150 – Spring 2008 – Lec #22: Othello Design Example - 35 Revised Board Shadow Cells Normal Cells we’ve designed CS 150 – Spring 2008 – Lec #22: Othello Design Example - 36 Shadow Cells Always empty (no next-state logic) Can’t be selected localOrRemote, local = false for all colors and directions Just a small collection of 6 wires connected to ground Key advantage: only two cell types, one trivial Disadvantage: lose a little efficiency from specialization of edge, corner cells Always worth it! Let a synthesizer optimize away the constants CS 150 – Spring 2008 – Lec #22: Othello Design Example - 37 Timing Diagram for Each Move Set Current Mover Latch Legal Moves, Remote Values Select Square CS 150 – Spring 2008 – Lec #22: Othello Design Example - 38 Update Current State of All Squares Logic for controller Read Move From Controller No Legal Mo v e Make No Legal Move Controller Transition l ga L e ve s Mo N o M Leg ov a e l Start Move is Legal Update Board Make Legal Move Controller Transition CS 150 – Spring 2008 – Lec #22: Othello Design Example - 39 Game Control Logic Move white Move=black Move=white Move black No legal Move Move=black (no white move) Move=white (no black move) l ga le o ve N mo No m leg ov al e Move White No legal move Move black Game Over Othello Game Controller FSM CS 150 – Spring 2008 – Lec #22: Othello Design Example - 40 Key Steps to Making the Design Work Software implementation first! I did it in Smalltalk Tastes Differ, but… OO programming model tends to fit circuits well Map each object onto a circuit Variables tend to map to latches Functions tend to map to logic circuits Unit test, unit test, unit test! Design test circuits for each component Synthesize test circuits as part of the design Audit, audit, audit! Pin out internal state where possible E.g., Legal should be displayed visually CS 150 – Spring 2008 – Lec #22: Othello Design Example - 41 Timing Bugs Nastiest, hardest to catch Two common examples: Read-Before-Wirte and Write-Before-Read Read-Before-Write Reader reads sequential value before writer has updated it Acts on old value E.G. no legal move but controller sees legal move from previous value Write-Before-Read Writer writes before old value has been acted on Reader doesn’t act on value CS 150 – Spring 2008 – Lec #22: Othello Design Example - 42 Two Solution Dirty/Clean bits Writer sets dirty bit, reader cleans it when read Writer checks dirty bits clean before writing, reader checks set before reading Error raised if condition not met FIFO Queues Writer writes, reader reads Decouples send/receive asymmetries by a cycle or so Can become event-driven: Reader only reads when new value Still have to check overflow, etc Automatically implemented in V++ CS 150 – Spring 2008 – Lec #22: Othello Design Example - 43