package Ġcom . a oc . int code . network Ċ Ċ import Ġcom . a oc . int code . computer . Int Code Computer Ċ import Ġcom . a oc . int code . computer . System Output Ċ import Ġcom . a oc . int code . network . packet . Packet Ċ import Ġcom . a oc . int code . network . packet . Packet Data Ċ import Ġcom . a oc . log . Ad vent Logger Ċ Ċ /** Ċ Ġ* ĠAn Ġ[ Int Code Computer ] Ġwith Ġnetworking Ġenabled . Ċ Ġ* Ċ Ġ* Ġ@ param Ġsoftware ĠInstructions Ġfor Ġthe Ġ[ NetworkInterface Controller ]. Ċ Ġ*/ Ċ class ĠNetwork Computer ( software : ĠString ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcpu Ġ= ĠInt Code Computer ( software ) ĊĠĠĠ Ġprivate Ġval Ġnic Ġ= ĠNetwork Interface Controller () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe Ġcomputer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġboot () Ġ= Ġcpu . run () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConnect s Ġthe Ġcomputer Ġto Ġthe Ġ[ Int Code Computer Network ] Ġby Ġassigning Ġit Ġa Ġunique Ġ[ Network Address ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġassign Address ( address : ĠNetwork Address ) Ġ= Ġcpu . onNext Boot ( address ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe ceiv es Ġa Ġ[ Packet ] Ġsent Ġover Ġthe Ġ[ Int Code Computer Network ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlisten ( packet : ĠPacket ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnic . receive ( packet . data ) ĊĠĠĠĠĠĠĠ ĠAd vent Logger . info ("[ CPU # ${ packet . address }] ĠReceived ĠPacket Ġ${ packet . data }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCom munic ates Ġwith Ġother Ġ[ Network Computer ] Ġinstances Ġon Ġthe Ġ[ Int Code Computer Network ]. ĊĠĠĠĠ Ġ* ĠRes olves Ġand Ġconsume s Ġany Ġpending Ġincoming Ġ[ Packet ] s Ġqueued Ġby Ġthe Ġ[ NetworkInterface Controller ]. ĊĠĠĠĠ Ġ* ĠTrans mit s Ġany Ġoutgoing Ġ[ Packet ] s Ġwaiting Ġin Ġthe Ġ[ Int Code Computer ] Ġ[ System Output ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġhandle Incoming Packets ĊĠĠĠĠ Ġ* Ġ@ see Ġhandle Outgoing Packets ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Packet ] s Ġto Ġbe Ġtransmitted Ġover Ġthe Ġ[ Int Code Computer Network ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcommunicate (): ĠList < Packet > Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Incoming Packets () ĊĠĠĠĠĠĠĠ Ġreturn Ġhandle Outgoing Packets () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġ[ Network Computer ] Ġis Ġidle . ĊĠĠĠĠ Ġ* ĠA Ġcomputer Ġis Ġdee med Ġidle Ġof Ġit Ġhas Ġno Ġincoming Ġor Ġoutgoing Ġpackets . ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġidle , Ġelse Ġfalse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Idle (): ĠBoolean Ġ= Ġnic . has Empty Incoming Packet Queue () ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Outgoing Packets (): ĠMutable List < Packet > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġcpu . program . memory . output ĊĠĠĠĠĠĠĠ Ġval Ġoutgoing Packets Ġ= Ġmutable ListOf < Packet >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( output . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( addr , Ġx , Ġy ) Ġ= Ġoutput . getFirst Three Values () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutgoing Packets . add ( Packet ( Network Address ( addr ), ĠPacket Data ( x , Ġy ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoutgoing Packets ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Incoming Packets () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( nic . has Empty Incoming Packet Queue ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Input Instruction (- 1 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcpu . run () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( x , Ġy ) Ġ= Ġnic . consume () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Input Instruction ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Input Instruction ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcpu . run () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Input Instruction ( value : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcpu . program . memory . input . add ( value ) ĊĠĠĠ Ġ} Ċ }