[HN Gopher] From Nand to Tetris (2017)
___________________________________________________________________
 
From Nand to Tetris (2017)
 
Author : mikpanko
Score  : 449 points
Date   : 2023-12-22 15:31 UTC (7 hours ago)
 
web link (www.nand2tetris.org)
w3m dump (www.nand2tetris.org)
 
| mikpanko wrote:
| Here is a fun Nand game inspired by the course:
| https://nandgame.com/
 
  | AlchemistCamp wrote:
  | Here's an even more fun one with overwhelmingly positive Steam
  | reviews!
  | https://store.steampowered.com/app/1444480/Turing_Complete/
 
    | aleph_minus_one wrote:
    | Here is another game on steam that is nearer to the first
    | part of "From Nand to Tetris":
    | 
    | MHRD
    | 
    | https://store.steampowered.com/app/576030/MHRD/
 
      | vintermann wrote:
      | While we're recommending programming games, I think Virtual
      | Circuit Board is a bit underappreciated. It's a pure
      | sandbox, not a game, so you have to bring the ideas
      | yourself, but it hits a really sweet spot somewhere between
      | Minecraft redstone and Logisim.
      | 
      | You just draw traces and add gates on a grid, with a few
      | special IO components like the Nand2Tetris course. But
      | there's some kind of compilation of the circuit, and
      | simulation can be blazing fast, way faster than other
      | programming games/programming friendly sandbox games.
 
        | aleph_minus_one wrote:
        | > Virtual Circuit Board is a bit underappreciated.
        | 
        | For the convenience of the reader:
        | 
        | - Website: https://www.virtualcircuitboard.com/
        | 
        | - Steam: https://store.steampowered.com/app/1885690/Virtu
        | al_Circuit_B...
 
        | artsi0m wrote:
        | There is an emulator on steam called CRUMB.
        | 
        | Rather than being schematic, it is almost too real.
        | 
        | The 3D lab is equipped with a breadboard, power supplies,
        | signal generators, various passive and active components,
        | and chips such as the timer 555.
        | 
        | I attempted to use it to complete a lab from my
        | university, where I had to construct a trigger from a
        | chip with 3 NAND gates.
        | 
        | But at this point getting membership at nearest
        | hackerspace may be a decent option.
        | 
        | > But there's some kind of compilation of the circuit
        | Realistic enough. Back then you could compile your PCB
        | project in altium designer, but now this button would be
        | called validate.
        | 
        | Sorry, if I wrote too much in this discussion thread.
 
        | artsi0m wrote:
        | s/trigger/flip-flop/
        | 
        | I forget that in English it is more often called latch
        | and that there are also flip-flops, two different types
        | of what is called triggers in the East.
 
    | NanoCoaster wrote:
    | Definitely recommend Turing Complete. I've been playing it
    | off and on over the last few weeks, just finished the first
    | working CPU. It includes small hints and solutions for most
    | levels, so if you get stuck, you'll always have a way
    | forward. The interesting thing is, for a lot of levels, you
    | can just google the component you're trying to build and use
    | actual logic diagrams as guidance.
    | 
    | The game makes the whole topic a bit easier to grok with its
    | visuals and the ability to step through your circuits when
    | they're running. So, great fun. But beware, if you've been
    | bitten by Factorio addiction, you might be in danger of
    | missing a lot of sleep :)
    | 
    | Also, as some other comments mentioned, I highly recommend
    | the Zachtronics games. Exapunks is amazing. But they're quite
    | different, they're more like puzzle games about programming.
 
    | artsi0m wrote:
    | I played both of them. Turing complete has a more non-linear
    | arcade mode. I mean that you can choose which level you want
    | to complete first.
    | 
    | There is also soundtrack and a little bit of story line
    | present. There is also gog version of this game.
    | 
    | I feel that I learned almost no new skills this semester, but
    | I remember asking my circuit design lecturer questions about
    | this game (in particular, about the possibility of
    | constructing full-adder with fewer elements). That was fun
    | 
    | You can stick to nandgame, if you don't want to pay, you
    | loose almost nothing, but playing Turing Complete is more
    | handy because it keeps progress on your computer and/or on
    | the steam account. So, if you clean cookies every time you
    | restart your browser, when using ungoogled-chromium for
    | example, you better play Turing complete.
    | 
    | Also one internet friend advised me to play incredible pm
    | https://incredible.pm/
    | 
    | It is a similar game, but the main theme is proofs rather
    | than digital circuits. Hasn't played yet, unfortunately.
 
    | geoelectric wrote:
    | Turing Complete is a great game. Finishing it was a major
    | sense of accomplishment for me, particularly since I rarely
    | complete games (though Zachlikes are a common exception).
    | 
    | This is from my Steam review (one of two ever, I liked it so
    | much):
    | 
    | > Man, what a trip. I've played the NAND game and MRHD, among
    | others, but never quite got to the "build a computer"
    | endgame. I did with this one. At this point I've built a
    | 256-byte RAM system that does six math instructions, six
    | conditional jumps, and subroutine calls using its own stack--
    | then developed my own assembly language for it which I'm now
    | using in the endgame to solve more traditional programming
    | puzzles.
    | 
    | > And I designed and built the entire architecture for it
    | myself. The initial levels are mostly "one solution only"
    | problems that each results in you designing a component. But
    | by the time you're at midgame, all the decisions are yours as
    | long as the output is correct. Previous problems tend to hint
    | towards partial solutions of later problems, but very little
    | is given to you outright. That gives you an incredible sense
    | of accomplishment for what you put together.
    | 
    | That said, unless they improved the bit where wiring tends to
    | merge together and virtually short out during edits, it can
    | be a little frustrating once things get very complex. It's
    | not enough for me to not recommend it, but there was a point
    | where I felt like I was having to master the tricky interface
    | quirks as much or more than the logic. Shenzen IO did that
    | part much better.
 
  | Night_Thastus wrote:
  | It's a bit different, but I also recommend both TIS-100 and
  | Shenzhen IO. Both of them involve writing in an assembly-esque
  | language, and it's very fun to learn!
 
    | captn3m0 wrote:
    | I gave up early on TOS-100, but that was before I did
    | nand2tetris. I did Nand2tetris before Shenzhen-IO and really
    | enjoyed it.
    | 
    | Yet to finish Shenzhen IO, but I blame it on me stupidly
    | doing premature optimisation.
 
      | Night_Thastus wrote:
      | Both TIS and Shenzhen are cases where I'd say make
      | something ugly that works, then go back and fix it hours
      | later when you have new tools and experience.
      | 
      | IE, the very first puzzle gets an easier solution once you
      | learn about a hidden command.
      | 
      | There's satisfaction to leaving a solution to come back
      | days later and go "whoah, this better solution is so
      | obvious" which is easy to miss when you're stuck on it for
      | hours.
 
| 2OEH8eoCRo0 wrote:
| This project helped me get my first job after college.
 
| ess3 wrote:
| Cannot recommend this course enough
 
| yoyohello13 wrote:
| I took this course on a lark when I was working as a data
| analyst. It inspired me to change careers. Absolutely excellent
| course. Definitely do it if you've got the time.
 
  | hnthrowaway0328 wrote:
  | Congratulations! Did you switch to a lower level programming
  | career path?
 
    | yoyohello13 wrote:
    | I'm making apps for a local company now. Still valuable info
    | though. I use the text parsing knowledge I gained from this
    | course quite a bit.
 
      | hnthrowaway0328 wrote:
      | That's pretty good. I'm glad that you made the switch you
      | wanted.
 
| Semitangent wrote:
| I found nand2tetris a very natural progression for me after
| finishing Ben Eater's great 8bit computer series
| (https://eater.net/8bit/). It just makes you grok so many basic
| concepts of computer design which are quite often glossed over. A
| perfect project to start over the holidays!
 
  | Night_Thastus wrote:
  | Second recommending Ben Eater. I love his videos. Two of my
  | favorites are the introduction of loops, and the introduction
  | of interrupts. Seeing the code he wrote re-written using these
  | to be so much more elegant was very satisfying.
 
  | captn3m0 wrote:
  | I did nand2tetris during my time at Recurse, and I spent a lot
  | of time watching Ben Eater those days. They paired nicely.
 
  | JKCalhoun wrote:
  | Did Ben Eaters 6502 computer this past summer. Can also
  | recommend.
  | 
  | Guess I'll have to look into _NAND to Tetris_ now.
 
| grendelt wrote:
| The book is great - so, so cool seeing the layer upon layer of
| logic (and abstractions) that build up.
 
| pythops wrote:
| There is also this repo from george hotz, very interesting !
| https://github.com/geohot/fromthetransistor
 
  | jpcfl wrote:
  | I wasn't sure what I was looking at at first, since there's no
  | material, just a rough outline of a hypothetical course. The
  | initial commit makes it a little clearer:
  | 
  | > _Wrote this a few years ago, wanted to put it online. Hiring
  | is hard, a lot of modern CS education is really bad, and it 's
  | so hard to find people who understand the modern computer stack
  | from first principles. Maybe if I ever get 12 free weeks again
  | I'll offer this as a play at home course. I want to play too._
 
  | slalomskiing wrote:
  | It's funny he says a lot of modern CS education is bad
  | 
  | I did Computer Engineering rather than CS for undergrad and we
  | covered like 80% of the topics in that list
  | 
  | Had multiple courses in Verilog/OS and worked a lot with
  | microcontrollers/FPGAs. Building a CPU in verilog then writing
  | an assembler/compiler was definitely the highlight.
  | 
  | Was a hard program but I felt like I had a really good
  | understanding of the full stack coming out of it.
  | 
  | Maybe he just isn't familiar with CE?
 
    | throwaway17_17 wrote:
    | Where I'm did you do undergrad. My son is not having much
    | success finding a college to shoot for in terms of having a
    | goal. I think a curriculum like you describe would at least
    | show him some options that exist.
 
      | Jtsummers wrote:
      | Georgia Tech has (when I was there at least) a good CMPE
      | program.
 
      | bhasi wrote:
      | Gatech, UPenn, U Colorado Boulder all have great CompE
      | programs at both undergrad and graduate levels.
 
    | jholman wrote:
    | Seems to me that CE covers sections 1, 2, 3, 7, and a bit of
    | 5, and CS covers 4, 5, and 6. A traditional CS education
    | should teach 3, even though doing 3 is absolutely not the job
    | of CS grads.
 
| meter wrote:
| I first attempted this 7 years ago, after I graduated college. I
| got through the first 2 chapters. It was extremely rewarding. But
| regrettably, I abandoned it for other side projects.
| 
| I picked it up again 3 months ago, and it's been a blast. I'm on
| chapter 8, having completed the logic gates, ALU, CPU, assembler,
| and half of the virtual machine.
| 
| Every chapter is overwhelming -- in a good way. I keep thinking
| to myself, "how the hell is this going to work?" And when it
| does, it's so satisfying.
| 
| As a side project, purely for educational purposes, it's the most
| rewarding thing I've done. I've learned so much. It's a damn good
| project. And I'm damn proud of myself for sticking with it.
| 
| Highly recommended.
 
  | superfunny wrote:
  | We did the whole project as part of a class; it was one of the
  | best classes I took in my CompSci program. It was excellent.
 
  | MichaelZuo wrote:
  | How did you learn the prerequisite solid state physics
  | knowledge in order to fully understand the background behind
  | the first two chapters?
  | 
  | e.g. The actual mechanism by which an integrated circuit
  | transforms input into useful output. I've never been able to
  | find a solid explanation on how even the simplest real world
  | integrated circuit, such as a TI SN7400, actually does that.
 
    | jon-wood wrote:
    | The course explicitly states that it's not a physics, or even
    | really an electronics, course. It doesn't go into the gritty
    | details of how all this stuff works in the real world, just
    | how once it does work you can string it all together to build
    | a computer and then a virtual machine to run on it.
 
    | moritzwarhier wrote:
    | I have only faint memories of my beginner's course on this
    | topic at university, and absolutely no knowledge.
    | 
    | Somehow I remember the word MOSFET.
    | 
    | I think the wikipedia articles about logic gates should
    | provide all necessary cross references.
    | 
    | "Fully understand" is an elusive term though. How do you
    | fully understand the solid-state physics of logic gates if
    | you don't fully understand all of physics, chemistry, maybe
    | even quantum mechanics...
    | 
    | Not meaning to be dismissive though! I love to try to fully
    | understand things and hate having to accept black box logic.
    | But I also have to admit that I've given up on this approach
    | for many things a long time ago.
    | 
    | Skimming the course summary, it sounds as if this "Hardware
    | Description Language" might mark the boundary of what this
    | course is about.
    | 
    | Makes sense, it's not "from physics to NAND", it's "from NAND
    | to Tetris" :)
 
      | FredPret wrote:
      | As frustrating as it is to black-box certain domains of
      | knowledge, it's an incredibly useful mental shortcut when
      | used judiciously.
 
        | bigstrat2003 wrote:
        | It's also just plain necessary as human knowledge gets
        | more and more complex. The more time you spend on
        | learning, the less time you have to actually make use of
        | that knowledge. Ars longa, vita brevis.
 
    | jholman wrote:
    | You're making a category error, I think. This books/course
    | doesn't cover physics. It doesn't even cover signal stuff,
    | like stuff about how fast the voltage levels stabilize, or
    | even voltages at all.
    | 
    | It's not "silicon wafer to Tetris" or "pile of protons and
    | neutrons to Tetris" or "transistors to Tetris". You start
    | with nand gates (and later also you get flipflops for free).
    | 
    | This course would work equally well on nand gates made of
    | carved wooden gears, or nand gates made with fluidic logic,
    | or nand gates made by encoding the whole thing into O-gauge
    | hobby railroads.
    | 
    | If that's the level of explanation you seek, this book is
    | incredible.
 
      | MichaelZuo wrote:
      | > It's not "silicon wafer to Tetris"...
      | 
      | That is a good point, I had just assumed that information
      | was available somewhere online, but it doesn't seem likely.
 
        | amenghra wrote:
        | https://nandgame.com/ has a cmos level towards the end.
        | It doesn't explain the transistor-level physics but does
        | let you play with things.
        | 
        | The art of electronics book might be a good place to
        | start if you want to learn the physical/electrical layer.
 
        | svnt wrote:
        | Something like this will at least get you conversant. You
        | only need the first few chapters, and can skip BJTs.
        | 
        | https://archive.org/details/microelectronicc00jaeg/page/n
        | 11/...
 
        | alted wrote:
        | Lower-level teaching resources definitely exist! Here are
        | my favorites:
        | 
        | - The Zero to ASIC course (and Tiny Tapeout) [1] explains
        | transistor circuits and teaches you an open source
        | software stack---and you get a chip physically
        | manufactured! You could make the Nand to Tetris computer
        | in actual silicon (if you can get enough transistors).
        | 
        | - To learn how things are manufactured on silicon wafers,
        | get textbooks on microfabrication. A decent starting
        | point is [2]. There's also a good video series [3] for a
        | quick overview.
        | 
        | - To understand how a single transistor or diode works,
        | get textbooks on "semiconductor devices". A good starting
        | point is the free online [4].
        | 
        | [1] https://www.zerotoasiccourse.com/
        | https://tinytapeout.com/
        | 
        | [2] "Introduction to Microelectronic Fabrication" by
        | Jaeger
        | 
        | [3] https://siliconrun.com/our-films/silicon-run-1/
        | 
        | [4] "Modern Semiconductor Devices for Integrated
        | Circuits" by Chenming Hu,
        | https://www.chu.berkeley.edu/modern-semiconductor-
        | devices-fo...
 
      | _fizz_buzz_ wrote:
      | A "silicon to nand gate" would be a sweet complimentary
      | course. However, probably more difficult to make hands on.
 
      | SilasX wrote:
      | I vaguely remember someone trying to go the other
      | direction, and teach "Tetris to Quake" but I can't find
      | substantiation that course ever existed, and might have
      | confused it with this article:
      | 
      | http://archive.gamedev.net/archive/reference/articles/artic
      | l...
      | 
      | I'd also be interested in anything that extends the stack
      | from where nand2tetris left off, because, while I loved
      | it[1], it felt unsatisfying that can't actually compile to
      | usable binaries for the hardware -- your executable can't
      | usually fit in memory and it doesn't teach you how swapping
      | (or whatever) would get you to that point. It also doesn't
      | cover more common hardware/OS issues like interrupts, or
      | having juggle multiple running programs.
      | 
      | [1] most interesting technical project I've ever completed,
      | with the possible exception of Microcorruption.com.
 
    | wintogreen74 wrote:
    | The book is a great example of how we do pretty much
    | everything with computers today: abstraction. You can
    | definitely learn how a transistor works but this book/course
    | explicitly starts with "you've got a NAND chip - GO!"
 
    | cdcarter wrote:
    | Ben Eater does have a handful of early videos on his YouTube
    | page that gave me a much better understanding of what's
    | happening down at the physical and particle level. But at the
    | end of the day, to succeed with this material you just need
    | to understand the theoretically digital function of a
    | transistor, not the physical properties.
 
    | kragen wrote:
    | btw the sn7400 is already a fairly advanced ic; something
    | like an uln2003 is closer to 'the simplest real world
    | integrated circuit'
    | 
    | probably the best place to start for this, in a top-down
    | sequence, is _the art of electronics_ by horowitz and hill.
    | it explains how transistors and diodes act in SS1.6, SS2, and
    | SS3, initially explaining transistors with the simplified
    | 'current amplifier' model (which already goes beyond the
    | 'transistor switch' model you're thinking of), then
    | quantitatively with the ebers-moll model; they're focused on
    | how to use this information to design working circuits from
    | discrete components you can put together on a circuit board.
    | camenzind's _designing analog chips_ (available free online)
    | goes into how to use this information to design actual chips
    | (not only does nand2tetris get into things like metastability
    | and noise margin, the authors seem to be confused about what
    | a chip even is, thinking you can make a chip by assembling
    | other chips)
    | 
    | but the ebers-moll model is still not solid-state physics
    | knowledge. so far the best overview i've found of that is
    | madou's 'fundamentals of microfabrication and nanotechnology'
    | which has a couple of chapters about solid-state physics,
    | going into the historical development of quantum mechanics.
    | but it's not really a quantum mechanics textbook; it's just
    | an overview that shows where quantum-mechanical knowledge
    | fits into understanding solid-state physics
    | 
    | 'the feynman lectures on physics' is the best quantum
    | mechanics textbook i've found so far, but because my
    | knowledge of quantum mechanics is even more minimal, please
    | don't trust my recommendation on this
    | 
    | hope this helps. good luck in your learning voyage!
 
      | duskwuff wrote:
      | > btw the sn7400 is already a fairly advanced ic; something
      | like an uln2003 is closer to 'the simplest real world
      | integrated circuit'
      | 
      | If the goal is to explain how logic is implemented in
      | general, skipping bipolar transistors and TTL and jumping
      | directly to MOS may be easier. The behavior of a FET is
      | fairly easy to explain, especially if you don't care about
      | the ohmic region (which you usually don't in logic ICs),
      | and it's straightforward to step from there to a practical
      | implementation of a simple gate like an unbuffered NAND --
      | the latter of which can be trivially assembled on a
      | breadboard with as little as two FETs and a resistor for a
      | NMOS implementation.
 
    | 1000100_1000101 wrote:
    | Aside from his basic 8-bit CPU, Ben Eater goes into how
    | transistors work too:
    | https://www.youtube.com/watch?v=DXvAlwMAxiA . Once you've got
    | transistors, his videos walk you through making gates. Once
    | you've got gates, he switches to the 74xx series and builds a
    | CPU.
 
  | wintogreen74 wrote:
  | I've done this too, and it also took me multiple (3!) tries to
  | get through the entire thing. I interleaved it last fall/winter
  | with Ben Eater's amazing series on building an 8-bit computer
  | on breadboards. I bought everything over several months from
  | China, then built the subsystems as the parts arrived over the
  | winter. You should do that next! Aside from being (maybe even
  | more) rewarding, it looks damn impressive to see all the
  | flashing LEDs _and_ understand what 's happening.
 
    | meter wrote:
    | Thanks for the recommendation. I'll definitely look into it!
 
    | sunday_serif wrote:
    | Yes! Ben eater's content accompanies nand to Tetris so well.
    | 
    | I did the 6502 project in which you assemble a computer
    | system on bread boards (wiring together the clock, cpu, ram,
    | etc).
    | 
    | It helped solidify many of the concepts from nand2tetris. For
    | some reason doing it all physically with real chips and wires
    | made it all a bit more memorable.
    | 
    | I'd love to try his other bread board project in which you
    | assemble all the inner workings of a cpu on bread boards as
    | well -- I think this is what you were referring to.
 
      | nvy wrote:
      | >It helped solidify many of the concepts from nand2tetris.
      | For some reason doing it all physically with real chips and
      | wires made it all a bit more memorable.
      | 
      | Hang on a second, does nand2tetris not involve real chips
      | and wires?
 
        | sircastor wrote:
        | No, nand2tetris is done in virtual environments.
        | 
        | This is largely about accessibility. If it's tied to
        | hardware, fewer people can do it. Additionally, real
        | hardware means there's additional opportunity for error
        | due to faults in the hardware or environmental variables.
        | 
        | That said, Nand2Tetris could, in theory, be done with a
        | bunch of 74xx NAND chips on a breadboard.
 
| datameta wrote:
| I intend to pick back up from where I left off about a year and a
| half ago, I believe chapter 6. Super interesting project where I
| learned a lot about using an HDL, computer architecture, and
| gates in general.
 
| pkilgore wrote:
| I graduated from this and I cannot recommend it highly enough.
| 
| If you don't have a computer science or EE background, it
| completely de-mystifies the fundamentals of your machine in a
| deeply engaging way.
 
| elevaet wrote:
| I wonder if the prequel "sand2nand" would be possible as a DIY
| project?
 
  | samvher wrote:
  | Sure: http://sam.zeloof.xyz/first-ic/
 
    | elevaet wrote:
    | Are you the same Sam? Either way, nice project wow!
 
      | samvher wrote:
      | Different Sam! :)
 
      | kragen wrote:
      | different sam, still has a lot of awesome projects
 
    | Two9A wrote:
    | Oh goodness, this is the kind of thing I've been trying to
    | find for years now: some method of making a computer from
    | scratch, as in from raw materials.
    | 
    | Will have to look into your progress, thanks.
 
      | samvher wrote:
      | Just to clarify, not my project! :)
 
    | cjpearson wrote:
    | > Native oxide is stripped off the wafer with a quick dilute
    | HF dip and then they are extensively cleaned in Piranha
    | solution (H2SO4:H2O2), RCA 1 (H2O:NH3:H2O2), RCA 2
    | (H2O:HCL:H2O2), followed by another dilute HF dip.
    | 
    | Fascinating project, but I'm not going to try this one at
    | home
 
| jackphilson wrote:
| If I'm into web development, how practically useful is learning
| low level stuff like this, factoring in opportunity cost?
 
  | frakt0x90 wrote:
  | In my opinion, learning anything in your field is useful
  | because it helps you form a better mental representation of
  | what you're doing. Will building electronics directly help with
  | mundane web dev? Maybe not. But if you think it's cool, do it!
  | Have fun! Broaden your horizons!
 
  | gorjusborg wrote:
  | I see this question as analogous to 'how useful is building a
  | car from scratch?'
  | 
  | The person building a cat from scratch will undoubtedly
  | understand more than others, and may be able to fix that home
  | brew car. They may, with some difficulty be able to apply that
  | understanding to other cars.
  | 
  | But, you definitely don't need to build a car from scratch to
  | be a race car driver.
 
    | kjs3 wrote:
    | _building a cat from scratch_
    | 
    | That _would_ be an interesting project.
 
      | aleph_minus_one wrote:
      | > _building a cat from scratch_
      | 
      | > That _would_ be an interesting project.
      | 
      | Here is the source code of the OpenBSD implementation of
      | cat:
      | 
      | > https://github.com/openbsd/src/blob/master/bin/cat/cat.c
      | 
      | and here of the GNU coreutils implementation:
      | 
      | > https://github.com/coreutils/coreutils/blob/master/src/ca
      | t.c
      | 
      | Thus: I don't think building a cat from scratch or creating
      | a tutorial about that topic is particularly hard (even
      | though the HN audience would likely be interested in it).
      | :-)
 
        | artsi0m wrote:
        | Building a shell from scratch (or some pre-made starting
        | point) seems to be an exercise in a lot of operating
        | systems courses and also in Tanenbaum's book on Operating
        | Systems.
        | 
        | There is this guide, divided in parts:
        | https://github.com/tokenrove/build-your-own-shell
        | 
        | I think you right, and implementing core utils is a nice
        | exercise in system programming. Maybe, it even can be
        | used to create some automated tasks with tests on
        | codewars.
        | 
        | Once upon a time I implemented expr(1) but it was too
        | simple, without regex part.
 
        | bigstrat2003 wrote:
        | I'm 99% sure that kjs3 was joking about building the kind
        | of cat that goes "meow", not a program. ;)
 
        | kjs3 wrote:
        | 100%. And considering the OP mistyped "car" as "cat", I'm
        | really, really hoping aleph_minus_one was making a
        | different kind of attempt at humor, but around here you
        | never know.
 
        | aleph_minus_one wrote:
        | You should then alias "cat" to print "meow" instead of
        | concatenating files.
        | 
        | ;-) ;-) ;-)
 
  | kjs3 wrote:
  | If opportunity cost is how you decide such things, I'm guessing
  | this is not for you. There's undoubtedly some new JS framework
  | that's about to be The Next Big Thing.
 
  | jobs_throwaway wrote:
  | Understanding intuitively how compilers work, and how the
  | various translators to/from VMs and machine code, is, I think,
  | pretty useful. Maybe not in day-to-day web dev work, but it
  | will help you around the edges.
 
  | brailsafe wrote:
  | It depends whether you have any opportunities at the moment
  | that are directly attributable to a singular focus on "web
  | development". That's not a productive or healthy way to look at
  | things imo--though it might seem like it if you're relatively
  | knew--but if your prospects are good right now, then this won't
  | help you necessarily keep your current job or get another one.
  | It will help you reason about code, logic, and computers in a
  | way you wouldn't otherwise, but you'll have a hard time if
  | you're not enthusiastic about learning for the novelty of it,
  | because it will eventually be quite challenging and you'll need
  | to allocate significant amounts of time.
  | 
  | I say that it's not a productive way to look at it, because
  | intensity and longevity of singular professional focus only
  | lasts as long as your intellectual and physical infrastructure
  | around it, which means doing things that are somewhere between
  | a short and long distance away from your core subject;
  | sleeping, learning fundamentals, algorithms, design, hiking
  | etc.. (Web Dev, as with anything, can get just as intensely
  | unstimulating as it can stimulating)
  | 
  | Also, learning how your language kind of gets compiled is just
  | fascinating.
 
    | brailsafe wrote:
    | To elaborate on this slightly, when I eventually burnt out
    | from just grinding frontend and working a stressful frontend
    | job, I spoke to someone much more experienced than me in
    | medicine who suggested that basically anything can be
    | interesting if you keep going deeper. That's stuck with me in
    | the 6 years since, and I don't worry much about drilling web
    | stuff as much
 
  | artsi0m wrote:
  | As a backend web developer you can learn about the difference
  | in pre-fork and polling model in web servers, which
  | interconnected with c10k
  | 
  | http://www.kegel.com/c10k.html
  | 
  | This will give you ability to reason about the web server
  | configuration you want to use.
  | 
  | But both fork(2) and epoll(7) [kqueue(2), iocp] would stay at
  | low level relatively of place where you operate.
  | 
  | Don't know what to say about fronted though, but there are
  | probably some new points of view on JS you can get by
  | implementing it as an interpreter in courses like crafting
  | interpreters.
 
  | kragen wrote:
  | opportunity cost is like 100 hours, which is pretty small
  | 
  | usefulness for web development is that probably right now there
  | are things you think are 'too hard' or even inconceivable
  | 
  | after those 100 hours nothing will be inconceivable
 
| huytersd wrote:
| Nothing is going to beat the SAP-1 computer and original textbook
| by Malvino for this experience.
 
  | bmitc wrote:
  | Is the book you're referring to _Digital Computer Electronics_
  | by Albert Paul Malvino?
 
| porridgeraisin wrote:
| Cannot recommend it enough.
 
| emschwartz wrote:
| I loved this course and would strongly recommend it to anyone who
| works with computers that hasn't taken low-level CS classes.
| 
| This course does an exceptional job of giving you an intuitive
| understanding of some critical parts of how a computer works that
| affect higher-level programs and programming languages (for me
| the biggest aha! was grokking the difference between the stack
| and the heap). It is also incredibly fun to appreciate how
| magical it is that these complicated machines we use are just
| built from these simple circuits that you keep building up and
| building up through the course. Finally, the teachers did a
| fantastic job of simplifying what could be multiple semesters
| worth of material to quickly give you the gist of things like
| assembly languages, without oversimplifying.
| 
| Really can't recommend this enough if you have the time to do it.
| FWIW, the first part of the course (from NAND gates to building a
| CPU) is very fun and fairly easy. The second part (going from a
| computer to a full operating system) is quite a bit more work.
 
  | CWIZO wrote:
  | Is the online course and the book the same material? Trying to
  | figure out if I need both or either.
 
    | molly0 wrote:
    | Im currently taking this course without having the book and
    | it works great. I might buy the book later but for me it's
    | important to have the imposed weekly deadlines in order to
    | not just drift away and do something else instead.
 
    | aleph_minus_one wrote:
    | The two online courses at Coursera are based on the First
    | Edition of "The Elements of Computing Systems: Building a
    | Modern Computer from First Principles":
    | https://www.amazon.com/Elements-Computing-Systems-
    | Building-P...
    | 
    | The most recent edition of this book is the Second Edition:
    | https://www.amazon.com/dp/0262539802/
    | 
    | To quote from the Preface concerning what the difference
    | between these two editions is:
    | 
    | "The Second Edition
    | 
    | Although Nand to Tetris was always structured around two
    | themes, the second edition makes this structure explicit: The
    | book is now divided into two distinct and standalone parts,
    | Part I: Hardware and Part II: Software. Each part consists of
    | six chapters and six projects and begins with a newly written
    | introduction that sets the stage for the part's chapters.
    | Importantly, the two parts are independent of each other.
    | Thus, the new book structure lends itself well to quarter-
    | long as well as semester-long courses.
    | 
    | In addition to the two new introduction chapters, the second
    | edition features four new appendices. Following the requests
    | of many learners, these new appendices give focused
    | presentations of various technical topics that, in the first
    | edition, were scattered across the chapters. Another new
    | appendix provides a formal proof that any Boolean function
    | can be built from Nand operators, adding a theoretical
    | perspective to the applied hardware construction projects.
    | Many new sections, figures, and examples were added.
    | 
    | All the chapters and project materials were rewritten with an
    | emphasis on separating abstraction from implementation--a
    | major theme in Nand to Tetris. We took special care to add
    | examples and sections that address the thousands of questions
    | that were posted over the years in Nand to Tetris Q&A
    | forums."
 
    | emschwartz wrote:
    | I did the course without the book. I haven't actually looked
    | through the book, but the Coursera class was definitely
    | enough on its own.
 
    | brailsafe wrote:
    | I'd recommend watching the course material and reading each
    | chapter. It depends on a little luck which material clicks
    | and how quickly, for me it varied from chapter to chapter
    | whether or not I could get by with just the videos.
 
| mnsc wrote:
| Is the estimated hours realistic? 43 hours for part 1 and 89 for
| part.
 
  | jobs_throwaway wrote:
  | Sounds about right from my experience. I did this in a 10-week
  | academic quarter spending ~10-15 hours a week on the projects.
  | Might be a bit more time if you have little background or lack
  | someone to explain things to you if/when you get stuck. The
  | compiler and OS are by far the most arduous parts.
 
  | brailsafe wrote:
  | Much like any software, it depends on how quickly you get the
  | hang of it, how many blocks of good time you can allocate, and
  | what your existing exposure is to digital logic and circuits.
  | 
  | I'm on the final chapter of the hardware section after probably
  | 5 months, where the last 2 months haven't been nearly as
  | focused and it showed immediately in my progress, and overall I
  | feel like my success rate looks like a bell curve; confusing at
  | first and slow, then not confusing and more productive, and
  | then the CPU took me like a month of taking periodic goes at
  | it. Now at the assembler, I feel like this the easier part of
  | any sequential programming involved in the latter half of the
  | course, and it'll ramp up significantly.
  | 
  | 89 seems plausible, if you get lucky, have good combinatorial
  | logic exposure already, and can really dedicate a decent
  | portion of most days to it, but I'd probably say that's a
  | generous minimum.
 
  | dbrueck wrote:
  | It'll vary a lot by your background and how much you play
  | around along the way.
  | 
  | If you're pretty familiar with most of the concepts and stick
  | to the requirements, you can do the whole thing in 40-50h.
  | OTOH, if you're encountering new concepts and really want to
  | internalize them and/or if you take fun detours then I'd plan
  | on 100-150h or more.
 
    | bmitc wrote:
    | It also varies by how professional you provide your
    | solutions. If you start wanting to test things, give proper
    | errors, etc., it will start increasing the time needed by
    | quite a lot.
 
  | vintermann wrote:
  | I only did part 1 so far, but it felt like less than that.
  | Whether that was because of experience, or because it was fun
  | enough that it felt shorter, I don't know!
 
| j_m_b wrote:
| I loved and completed this course, just wish I could actually be
| working on this in my day job!
 
| atulvi wrote:
| I want sand2tetris next.
 
  | JKCalhoun wrote:
  | Sand2NAND is the only thing missing.
  | 
  | I'm reminded though of the late Dave Gingery's series of books,
  | _Shop From Scrap_ [1] where he tries to take you from building
  | a foundry up to machine tools:
  | 
  | [1]
  | https://gingerybookstore.com/MetalWorkingShopFromScrapSeries...
 
  | shpx wrote:
  | Still waiting for Quantum Mechanics to Tetris
 
| cadr wrote:
| My favorite thing about the book is that each section builds on
| things, but you don't have to go through the whole thing to get
| there. So, for example, if you did a lot of hardware in the past
| but never got around to writing a compiler, you could in theory
| start there. Or if you did a lot of software before but never
| actually built an ALU, etc, you can get a lot out of just doing
| the hardware sections.
 
| cushychicken wrote:
| Does this still use a custom hardware description language?
| 
| The curriculum here is very solid - my only critique is that it
| uses a custom HDL instead of Verilog, VHDL, or SystemVerilog.
| 
| It wouldn't have been a huge stretch to do that, and make the
| skills taught that much more real as a result. Without the
| practical aspect of exposure to real HDLs, it seems more like a
| toy than a tool.
 
  | warkanlock wrote:
  | Knowing Verilog, I must disagree. Although it would be more
  | beneficial if the book focused on hardware, its primary goal is
  | to teach something other than hardware-specific definitions.
  | HDL serves as a bridge to illustrate communication with
  | predefined logic gates.
  | 
  | The book should include a mention or an appendix to clarify its
  | real-world applications. By the end of chapter five, I was
  | dissatisfied, feeling a lack of control over the crucial
  | aspects of the hardware I just built. However, a book can only
  | do justice to some of the missing pieces of information we
  | have.
 
    | brailsafe wrote:
    | I found Chapter 5 to be quite challenging, largely because it
    | took a while to understand the combinatorial way in which any
    | of the chip parts would get new inputs and so on, especially
    | coming from a traditional sequential programming background.
    | 
    | What specifically did you feel like you were lacking from the
    | language?
 
  | bmitc wrote:
  | I don't think there's anything to be gained by switching to
  | VHDL or Verilog. Their custom HDL is a fine HDL for the uses of
  | the course. There's so much commonality that they're
  | effectively interchangeable syntactically. If the idea was to
  | use VHDL or Verilog such that one could actually make the CPU
  | on silicon or an FPGA, then that opens up a whole can of worms
  | that is well beyond the scope of the course. I do think it
  | would be awesome if they had a sequel that did this, but I
  | think it doesn't make sense in the context of the existing
  | course.
 
  | sweetjuly wrote:
  | This was my experience with the course as well. It was fun but
  | not useful.
  | 
  | Learning Verilog later really opened the world of digital
  | design for me and has let me build actually useful things. It's
  | probably a non-goal though for this coarse to turn people into
  | digital designers, this seems more aimed at people with a
  | passing interest in HW as opposed to those who really want to
  | go deep.
 
| bannisterjw wrote:
| Very cool article
 
| skripp wrote:
| I highly recommend you play the game "Turing complete" alongside
| this course. Will give you an additional visual way of looking at
| the problems.
 
| kebsup wrote:
| What I remember from this course is that the first few homeworks
| can be done in a few hours in one evening, and then you suddenly
| spend your weekend building a compiler.
 
  | artsi0m wrote:
  | So, here the question I want to ask someone who dealt with this
  | course:
  | 
  | How much of the topic of compilers is covered in this course?
  | Have you built an optimizing compiler that creates binaries
  | from a [relatively] high-level language such as C? Or you have
  | just created an assembly for a specific architecture?
 
    | rmshin wrote:
    | Without too much experience in writing compilers beyond this
    | course, I'd say that the course focuses on grounding your
    | conceptual/intuitive knowledge of how compilers work rather
    | than any serious exposition into modern-day production-grade
    | compilers.
    | 
    | You write the assembler for the course's own hardware
    | architecture called Hack, then a compiler backend that
    | converts a stack-based VM intermediate representation (IR) to
    | assembly, and finally a compiler frontend that does syntax
    | analysis and code generation to translate the book's high-
    | level language Jack to the IR.
 
| Kortaggio wrote:
| This was an amazing course and is one of the most rewarding
| computer science courses I've taken! I loved that there was
| nothing left to "magic" and it was the first time I felt like I
| understood the "full stack" of the Java-like code I was writing
| right down to the transistors.
| 
| Self-plug for a full-blown minesweeper game I made for the final
| project: https://github.com/billmei/nand2minesweeper It's a
| complete game with a tutorial, custom RNG, and unit tests, using
| their hardware simulator.
 
| westurner wrote:
| Similar: "Show HN: Tetris, but the blocks are ARM instructions
| that execute in the browser"
| https://news.ycombinator.com/item?id=37086102
 
| cubefox wrote:
| I wish there was something like that for computability theory.
| 
| Presumably for historical reasons, professors of theoretical
| computer science love to talk about abstract machines like
| finite-state machines, pushdown automata, Turing machines etc.
| Not about logical circuits.
| 
| But arguably, logical gates are much more conceptually primitive
| than most of those automata above! They are basically an
| implementation of propositional logic, albeit potentially with a
| dimension of time and delay. And they are nonetheless somewhat
| close to how actual computers work. So why do they ignore them as
| a model of computation?
| 
| My guess is that they don't talk about them because they only
| awkwardly harmonize with the classical models of computation:
| FSMs, TMs and the like, and the neat hierarchy of computability
| they place them (what languages in the Chomsky hierarchy they
| recognize).
| 
| For example, Turing machines have two kinds of states: Objects
| called "states", and the states of the tape cells. The former are
| finite and the latter are infinite. Pushdown automata make a
| similar distinction into two types of states. Logical circuits,
| on the other hand, don't distinguish two different kinds of
| states in such a way. It's all just circuits.
| 
| The classical abstract machines have other problems as well:
| Arguably, among abstract machines, a real CPU is most similar to
| a universal Turing machine, because it can execute arbitrary
| programs. But according to the theory of computation, CPUs are
| merely equivalent to finite-state machines! Because they lack an
| equivalent of an infinite tape. Infinity is a strange detail to
| emphasize here, as logical circuits are merely "potentially
| infinite" in the same way finite-state machines are merely
| potentially infinite. But that doesn't make them similar to each
| other. The relevant difference seems to be that circuits with
| delay allow for "memory" (like flip-flops), while finite-state
| automata don't.
| 
| I would like to see a course or book on theoretical computer
| science that tackles this issue: "From NAND to Turing Machines".
 
  | credit_guy wrote:
  | Maybe something like this?
  | 
  | https://computationbook.com/
 
    | cubefox wrote:
    | Judging from the overview, they seem to implement classical
    | abstract machines using Ruby. Implementing something
    | relatively simple (an abstract machine) with something
    | complex (Ruby) is quite unilluminating. I was asking for
    | someone who implements them using logical circuits. While
    | also explaining how their different "power" (in terms of
    | languages they recognize in the Chomsky hierarchy) is
    | reflected in their logical circuits.
 
  | kragen wrote:
  | as you say, the chomsky hierarchy is surely an influence, but i
  | don't think that's the main thing
  | 
  | i think it's probably because a turing machine can do universal
  | computation and can be described completely in a couple of
  | paragraphs, while you need at least several hundred logic gates
  | to describe something that can do universal computation (if you
  | give it infinite memory), and then you still don't have a
  | convincing argument that what it does is _universal_ in any
  | interesting sense
  | 
  | until you bring in turing machines, anyway
  | 
  | you can write a turing machine in about one line of c; the
  | description of a computer in terms of nands doesn't give you
  | that
 
    | cubefox wrote:
    | That seems to be a somewhat strange comparison. Logical
    | circuits are arguably not much more complex than finite-state
    | machines, and theoretical computer science professors don't
    | have an aversion to those. So it doesn't seem like they find
    | logical circuits too primitive. They even seem to strive for
    | primitivity, as Turing machines are much more conceptually
    | primitive than things like register machines or actual CPUs.
    | 
    | Moreover, a logical circuit itself is actually easier to
    | describe than a Turing machine. Both logical circuits with
    | delay and Turing machines can do "universal computation" for
    | any reasonable sense of the term (demanding an infinite
    | element is arguably not reasonable).
    | 
    | And to give a "convincing argument" that they are universal
    | is quite difficult even for Turing machines. What would such
    | an argument even be? In practice, it's more the fact that
    | there are _no known counterexamples_ which causes us to
    | believe in the Church-Turing thesis (that any problem that we
    | would intuitively consider  "computable" is also computable
    | with a Turing machine or logical circuit, and vice versa),
    | rather than any one (positive) "convincing argument".
 
    | nickpsecurity wrote:
    | You might get more mileage out of Abstract, State Machines.
    | They operate on structures instead of characters. Quite a few
    | tools exist for them, too.
 
  | aleph_minus_one wrote:
  | > But arguably, logical gates are much more conceptually
  | primitive than most of those automata above! They are basically
  | an implementation of propositional logic, albeit potentially
  | with a dimension of time and delay. And they are nonetheless
  | somewhat close to how actual computers work. So why do they
  | ignore them as a model of computation?
  | 
  | Simple: logic circuits for propositional logic are not Turing-
  | complete, and in a lecture about theoretical computer science
  | one wants to teach such more sophisticated, mathematical models
  | of computation.
  | 
  | On the other hand, in basically every beginner lecture about
  | computer engineering (in German: "technische Informatik"), they
  | will teach you how how the transition function of a finite-
  | state machine can be implemented via combinational logic
  | (https://en.wikipedia.org/wiki/Combinational_logic), which can
  | be transformed into logic gates for implementing a Mealy
  | machine (https://en.wikipedia.org/wiki/Mealy_machine) or Moore
  | machine (https://en.wikipedia.org/wiki/Moore_machine) in
  | hardware.
 
    | cubefox wrote:
    | > Simple: logic circuits for propositional logic are not
    | Turing-complete, and in a lecture about theoretical computer
    | science one wants to teach such more sophisticated,
    | mathematical models of computation.
    | 
    | Logical circuits with delay (sequential [1] rather than
    | combinational logic) are indeed not Turing complete -- but in
    | the same uninteresting sense that a CPU is not Turing
    | complete: In a conceptually irrelevant way. As I argued,
    | Turing machines are precisely _not_ "much more sophisticated"
    | than CPUs or the circuits they are made out of. Turing
    | machines merely have infinite rather than potentially
    | infinite memory.
    | 
    | You could modify the concept of a Turing machine such that
    | its tape is potentially rather than actually infinite, and it
    | would change nothing of substance. Yet this machine would
    | suddenly only be considered equivalent to a finite-state
    | machine.
    | 
    | Apart from that, a perhaps theoretically interesting point
    | about combinational logic (circuits without time/delay) and
    | finite state machines would be that combinational logic is
    | apparently computationally weaker than finite-state machines.
    | Wikipedia doesn't say anything about that explicitly, but the
    | "classes of automata" image [2] they include in the article
    | does suggest it. But that, assuming it's true, should be
    | taught in theoretical computer science class, not in computer
    | engineering (if the latter mentions it at all).
    | 
    | But, much more importantly, they -- the theoretical computer
    | science professors, not the engineering guys -- should
    | explain the theoretical relation between circuits with delay
    | (sequential logic) and various automata, including Turing
    | machines.
    | 
    | The likely fact is that they ignore circuits because they
    | don't fit well into their supposedly neat picture of abstract
    | machines. In fact, they call their reliance on infinity as an
    | important difference between models of computation in
    | question.
    | 
    | [1] https://en.wikipedia.org/wiki/Sequential_logic
    | 
    | [2] https://en.wikipedia.org/wiki/File:Automata_theory.svg
 
| shpx wrote:
| I can also recommend the Digital Design and Computer Architecture
| lectures from ETH Zurich if you're trying to understand computers
| at a lower level:
| 
| https://www.youtube.com/playlist?list=PL5Q2soXY2Zi-EImKxYYY1...
 
| agentultra wrote:
| This is a great course, well put together, and very fun.
| 
| I did the second part in Haskell too! I wasn't sure what their
| container environment is like so I stuck with only the `base`
| library and it worked out well enough.
 
| dang wrote:
| Related. Others?
| 
|  _Ask HN: What books or courses do you know similar to "From Nand
| to Tetris"?_ - https://news.ycombinator.com/item?id=36853931 -
| July 2023 (29 comments)
| 
|  _From Nand to Tetris (Building a Modern Computer From First
| Principles)_ - https://news.ycombinator.com/item?id=27030046 -
| May 2021 (1 comment)
| 
|  _The Elements of Computing Systems, Second Edition_ -
| https://news.ycombinator.com/item?id=26036790 - Feb 2021 (97
| comments)
| 
|  _July 2021: 2nd edition of The Elements of Computing Systems_ -
| https://news.ycombinator.com/item?id=25329763 - Dec 2020 (1
| comment)
| 
|  _From Nand to Tetris: Building a Modern Computer from First
| Principles_ - https://news.ycombinator.com/item?id=18519883 - Nov
| 2018 (47 comments)
| 
|  _Build a Modern Computer from First Principles: Nand to Tetris
| Part II_ - https://news.ycombinator.com/item?id=14526344 - June
| 2017 (35 comments)
| 
|  _Build a Modern Computer from First Principles: From Nand to
| Tetris_ - https://news.ycombinator.com/item?id=13209452 - Dec
| 2016 (17 comments)
| 
|  _Building a Modern Computer from First Principles_ -
| https://news.ycombinator.com/item?id=12333508 - Aug 2016 (26
| comments)
| 
|  _Nand2Tetris: Building a Modern Computer from First Principles_
| - https://news.ycombinator.com/item?id=10369795 - Oct 2015 (1
| comment)
| 
|  _VHDL implementation of Hack computer from "Nand to Tetris"_ -
| https://news.ycombinator.com/item?id=10021275 - Aug 2015 (4
| comments)
| 
|  _Nand to Tetris 1_ -
| https://news.ycombinator.com/item?id=9593114 - May 2015 (24
| comments)
| 
|  _From NAND to Tetris: The Elements of Computing Systems
| [repost]_ - https://news.ycombinator.com/item?id=6963338 - Dec
| 2013 (3 comments)
| 
|  _Building a Modern Computer from First Principles_ -
| https://news.ycombinator.com/item?id=5888705 - June 2013 (83
| comments)
| 
|  _Building a Modern Computer from First Principles_ -
| https://news.ycombinator.com/item?id=4643836 - Oct 2012 (1
| comment)
| 
|  _Online course: Build your own simulated computer, assembler,
| lang, OS, & game_ - https://news.ycombinator.com/item?id=2928973
| - Aug 2011 (29 comments)
| 
|  _Elements of Computing Systems - Building a Modern Computer from
| 1st Principles_ - https://news.ycombinator.com/item?id=2273098 -
| Feb 2011 (2 comments)
| 
|  _The Elements of Computing Systems ( "From NAND to Tetris")_ -
| https://news.ycombinator.com/item?id=1834864 - Oct 2010 (2
| comments)
| 
|  _From Nand to Tetris in 12 steps_ -
| https://news.ycombinator.com/item?id=399141 - Dec 2008 (3
| comments)
| 
|  _Building a Modern Computer from First Principles_ -
| https://news.ycombinator.com/item?id=205322 - May 2008 (9
| comments)
 
| AlecSchueler wrote:
| Great memories of this book, and of the period of my life I
| picked it up in. I was at coffee with my girlfriend saying I'd
| read you could make all the logic gates using only NANDs, so we
| got curious and wrote NAND on a bunch of napkins to see if we
| could figure them all out.
| 
| We did and it was great fun. For each gate we figured it with
| NANDs we would write the name of the new gate on a napkin.
| 
| We took the napkins and the joy of it home and sheet a few days
| we started combining those gates up as well, trying to eventually
| figure out an entire ALU. And so along came multiplexors and a
| bunch of other fascinating stuff.
| 
| Eventually we got stumped, but I'd heard about this book and we
| decided to order it. The rest of the chapters really did help us
| get an understanding of the low level that had always been
| mysterious to me as someone with software experience only.
| 
| Can't say I ever did make it all the way through in terms of
| building around, though. Once it got more into the low software
| levels I felt I already had enough of an understanding that the
| work didn't seem so appealing, but the read was still fantastic.
 
___________________________________________________________________
(page generated 2023-12-22 23:00 UTC)