Neet!
I like the idea. I dare say it's disruptive. You could potentially eliminate one entire year, perhaps more, from a typical EE/CE curricula branch by prescribing just a few weeks' dabbling in this thing. (I mean, most places have those damned online math problem checker things, that never work and are always tedious to frustrating. This isn't much different, though -- I expect -- a lot more lenient on the acceptable solution side!)
Plus if kids just randomly find this and pick up on it, maybe pair it with some cheapshit Arduino-esque things so there's even something to hold in ones' hand, you could make even more of it.
I assume you're interested in comments?...
One odd thing about just the first puzzle. Not knowing the language and just guessing, my first instinct was "o = !a", which it turns out is a boolean negation. Which isn't a bitwise negation. I guess it implicitly casts one to the other, but the "hardware size" figure was massive, like 240-some-odd, whatever that means of course -- whereas the "~" version does indeed generate the 4 pictured.
I would like to know more about the "hardware size" number. What actually does it represent? Does that bear any relation to hardware that would synthesize IRL? Is it closer to RTL level (where a latch array is roughly equivalent to an adder or multiplier block), or gate level (and what kind -- MSI/SSI, or like NAND level)? Or neither, is it more of a software algorithmic result instead? (Which may still be representative of the underlying logic, but in a broadly different way, of course.)
Real hardware will, of course, optimize the boolean example fully away, but will also have adders, multipliers and other macro logic available on the fabric, making certain other operations far easier than sheer logic implies (e.g., using a counting integer in "Slow me" gets... 100-200 I think it was, which really only needs a couple latches and a constant adder; versus a ripple counter, which got me 44). Which is absolutely platform-dependent, of course -- I certainly wouldn't expect a game to simplify this sort of thing to that level!
The documentation... is rather terse and doesn't explain things very well. It's completely upside-down; in trying to use the documentation with the game, I'm spending all my time at the bottom, scouring just the syntax and declarations -- the first four challenges don't even begin to require a header, import, package, module, body or any of the high level structure mentioned!
In particular, the form of an expression or statement is presented in an unfamiliar way; this looks like a mess:
«annotation*» «direction?» «register?» «type»
«annotation*» id [«dimension»]* (= «defaultValue»)?
(, «annotation*» id [«dimension»]* (= «defaultValue»)?)*;
I've not seen the guillemets used before; from what I can tell, I would normally write this with a more diverse selection of braces:
[in|out|inout|param|const] [register] {type} <name>[<arraysize>] [= <defaultvalue>] [, <name2>[<arraysize>][= <defaultvalue>] [, ...]];
Where:
- square brackets [] denote an optional item,
- curly braces {} denote a required item,
- items separated by | means, pick just one
- angle brackets <> denote a required, user-defined parameter (e.g., a name for a variable)
- [in|out|inout|param|const] is the direction or visibility of the variable (and the items are...)
- [register] is a keyword which, if used, denotes a registered (persistent/state/memory/latch type) variable
- {type} is the type to declare the variable as; the primitive types are (so and so...; or list them in the braces), and <hyperlink> about libraries and stuff
- <name> is the name of the variable to declare
- [<arraysize>] is an optional parameter to specify an array type variable; use square brackets e.g., the name looks like "myarray[31]"
- [= <defaultvalue>] is the default (initial? resetted?) value of the variable[1]
- additional variables of the same {type} can be declared in the same way, separated by commas
- statement ends with a semicolon
I removed "<<annotation>>" because I don't have a clue what it means. Is that like putting labels on stuff in VHDL? -- It doesn't do anything, semantically, it's just to keep better track of things, metadata?
[1] I tried assigning a default in a few examples, but it didn't do jack. resetValue (which, though not mentioned, is apparently case sensitive) was required for that functionality.
I think I have a useful idea what <<direction?>>, <<register?>> and <<type>> are doing, which are also the only ones specified in that section.
I'm probably misinterpreting the use of the "*" and "?" in this definition as well. Something about optional, or "fill in the blank here" sorts of tokens I guess? Which I've normally seen indicated with different bracket types, which is also easier to read. If nothing else, provide a succinct definition so the reader isn't guessing.
And then on top of that, providing an example of each form (using/not each optional token), and explaining those. Verbose face-pounding-on-desk stuff.
Anyway, just to say, the documentation needs work. I don't know if this was written for the game, or was only a brief summary already on the site, or even is the "comprehensive" documentation for the language itself period (god, I hope not!).
If you want a game, it has to be easy and friendly. It's a puzzle, so leave the thinking for the solution, not for trying to figure out what to do.

As for the game itself:
- The text box looks like it stays highlighted where the cursor is, when not in focus (at least, in Chrome it does). More than a few times I've clicked "play", then started trying to edit with the keyboard, only to realize it's not in focus after all. The button should... not take focus, or automatically return focus to the previous object, or something. A key combo would also be handy (e.g., CTRL+ENTER, and put a note on screen showing this), since this is a rather keyboard-oriented puzzle. TAB is used for tabbing rather than cycle focus, so, that mechanism isn't really handy.
- The "compiler" errors/warnings are fairly cryptic, mostly summed up as "RTFM". I'll admit "RTFM" is still a little better than some of the messages I've had from, say, Quartus, but... it's a game. It should be a hint, relevant and useful. (Like it should on a real compiler..). Not a terse dismissal, and certainly not a dismissal towards equally unwelcoming documentation! Or if not everyone appreciates hints, make the hinting level selectable (like the online puzzles, like, Sudokus that have custom error checking options). Yes, I can guess making accurate, useful, general and yet sensitive error messages isn't exactly a trivial problem, but it's always one worth spending time on.
- The "compile" kind of takes a long time. Which might very well be justified. I have not written an HDL parser myself, so I have no idea. (Also, is this client side scripted?)
- The compile/notice/error message bar pushes the text box down. This doesn't hurt anything, but it's confusing if you're working in the text box and it appears to suddenly shift. Maybe it can be made into a static (always there, but color/text changing?) status bar?
- I like the traditional IDE style, highlighting and stuff. Could we get, like, a toolbox to pick keywords from? In the spirit of gaming, it would help to have an on-screen list of options, functions, statements, etc. to choose from. Doesn't at all have to be, like, a full-on grammar creation wizard, that would be kind of giving it away too easily. A quick visual tutorial describing the operators would also be cool ("I know I need o low when a and b are high, now, what thingy does that..?!").
Additional thoughts:
Hardware is, of course, hardly just (ideal, asynchronous) combinatorial and (ideal, no delay) sequential logic... Timing is kinda-sorta implied by the slopey edges of the waves, but it doesn't mean anything of course, that's just for visual style.
Adding timing constraints could potentially make one hell of an awful "game" (just look at how bad it is IRL..), but if well executed, could be a refreshing "advanced" challenge perhaps. And if that worked out well... would give you one hell of a tool to thumb in the noses of the big players. Take that, Altera, our tool that's just a toy is as powerful as yours and orders of magnitude easier -- and fun to use!
Or, the option of using different logic drives (IEEE 1164 std. 1, 0, Z, H, L...), or a "bare bones" mode where you only get to use binary operands on bit vectors (hope you know your Karnaugh maps!), stuff like that.
Being an analog guy myself, I can't help but imagine if even a "simple" circuit version of this could be made -- say, a signal has to be within so-and-so percent (absolute, or RMS error, or frequency, or..) of the example, and you have to use resistors, capacitors, inductors, diodes, transistors and op-amps to achieve it. Probably also in incremented skill levels, so you start with a small toolbox and go from there. Like the old days with, The Incredible Machine (anyone remember that one?), you get some parts, few at first, then more later, then more restrictive sets even later. Restrictions could include getting only certain component types, and of certain values. The tools are out there; I should think this kind of functionality could be combined with something like that Falstead simulator, probably with a fair amount of work. It would be really cool though.
...Then for the "pro" version, you combine the analog one with the PSHDL one and get a full on mixed signal puzzle game.

Tim