basics.go 883 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package std
  2. import (
  3. "sim3/ncl"
  4. "sim3/tri"
  5. "ypk/halt"
  6. )
  7. type Not struct {
  8. I ncl.In
  9. O ncl.Out
  10. }
  11. type Buffer struct {
  12. I ncl.In
  13. O ncl.Out
  14. }
  15. func (n *Not) Pin(c ncl.PinCode) ncl.Pin {
  16. switch c {
  17. case ncl.I:
  18. return n.I
  19. case ncl.O:
  20. return n.O
  21. default:
  22. halt.As(100)
  23. }
  24. panic(0)
  25. }
  26. func (b *Buffer) Pin(c ncl.PinCode) ncl.Pin {
  27. switch c {
  28. case ncl.I:
  29. return b.I
  30. case ncl.O:
  31. return b.O
  32. default:
  33. halt.As(100)
  34. }
  35. panic(0)
  36. }
  37. func NewNot() ncl.Element {
  38. n := &Not{I: newIn(), O: newOut()}
  39. go func(n *Not) {
  40. ncl.Step(n, func() {
  41. ok, val := n.I.Select()
  42. if ok {
  43. n.O.Validate(true, tri.Not(val))
  44. } else {
  45. n.O.Validate(false)
  46. }
  47. })
  48. }(n)
  49. return n
  50. }
  51. func NewBuffer() ncl.Element {
  52. b := &Buffer{I: newIn(), O: newOut()}
  53. go func(b *Buffer) {
  54. ncl.Step(b, func() {
  55. ok, val := b.I.Select()
  56. b.O.Validate(ok, val)
  57. })
  58. }(b)
  59. return b
  60. }