<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: VonTum</title><link>https://news.ycombinator.com/user?id=VonTum</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 24 May 2026 23:45:49 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=VonTum" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by VonTum in "The Rise of the Bullshittery"]]></title><description><![CDATA[
<p>I find especially painful the tradeoff between productivity and visibility. Every minute I spend trying to advertise my project is a minute I'm not spending making it better.</p>
]]></description><pubDate>Tue, 12 May 2026 20:15:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=48113884</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=48113884</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48113884</guid></item><item><title><![CDATA[New comment by VonTum in "Shared mutable state in Rust (2022)"]]></title><description><![CDATA[
<p>If you want to spawn multiple threads, all with access to a mutex, but without putting it behind an Arc, then you can simply spawn all your threads in a std::thread::scope(||{...}). These let you pass references &'scope Mutex<...>
I find Rc or Arc almost never the right tool for a job where I want to "share state" or such</p>
]]></description><pubDate>Mon, 06 Apr 2026 20:56:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=47666972</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=47666972</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47666972</guid></item><item><title><![CDATA[New comment by VonTum in "AI overly affirms users asking for personal advice"]]></title><description><![CDATA[
<p>You had me on the first three paragraphs, but the last two veer so far off course that I've no idea what you're trying to say. Mind clarifying?</p>
]]></description><pubDate>Sat, 28 Mar 2026 20:37:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=47557953</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=47557953</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47557953</guid></item><item><title><![CDATA[New comment by VonTum in "Building an FPGA 3dfx Voodoo with Modern RTL Tools"]]></title><description><![CDATA[
<p>Well still, why tie this kind of processing to the registers themselves? Sure having a shorthand to instantiate a queue of writes I could see, but float to fixed conversion has no place being part of a memory mapped register bank.<p>Wouldn't it be more sensible to have one module for converting the AXI-Lite (I presume?) memory map interface to the specific input format of your processor, and then have the processor pull data from this adaptor when it needs it? 
That way still all handling of inputs is done in the same place.<p>Edit: maybe, what it comes down to is: Should the register bank be responsible for storing the state the compute unit is working on, or should the compute unit store that state itself? In my opinion, that responsibility lies with the compute unit. The compute unit shouldn't have to rely on the register bank not changing while its working.</p>
]]></description><pubDate>Sun, 22 Mar 2026 16:14:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=47479014</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=47479014</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47479014</guid></item><item><title><![CDATA[New comment by VonTum in "Building an FPGA 3dfx Voodoo with Modern RTL Tools"]]></title><description><![CDATA[
<p>I find it odd the author adds all these extra semantics to their input registers, rather than keeping the FIFOs, "drain + FIFOs", "float to fixed point converting register", etc as separate components, separate from the task of being memory mapped registers. The central problem they were running into was one where they let the external controller asynchronously change state in the middle of the compute unit using it.<p>I'm noting down this conetrace for the future though, seems like a useful tool, and they seem to be doing a closed beta of sorts.</p>
]]></description><pubDate>Sun, 22 Mar 2026 15:51:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=47478777</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=47478777</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47478777</guid></item><item><title><![CDATA[New comment by VonTum in "Modern wealth is a parlour game played by the well fed"]]></title><description><![CDATA[
<p>Well both can be true, money is only made (or lost) on market swings. It is precisely the rich who can capitalize on such swings<p>Whereas for regular people, an upswing means nothing, whereas a downswing means job loss, mortgage rate hikes, etc.</p>
]]></description><pubDate>Wed, 11 Mar 2026 15:54:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=47337251</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=47337251</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47337251</guid></item><item><title><![CDATA[New comment by VonTum in "Ask HN: What Are You Working On? (March 2026)"]]></title><description><![CDATA[
<p>I've been building high-bandwidth memory streaming interfaces for HBM on VCK5000 & U280 FPGAs in my own language - "SUS".<p>The goal is to get consistent synthesis to 450MHz such that I can use a narrower 256-bit instead of a 512-bit interface, while maintaining full bandwidth. I've got it working at an FMax ranging 440-490MHz, though there's still some edge cases I need to hammer out.<p><a href="https://github.com/pc2/sus-xrt" rel="nofollow">https://github.com/pc2/sus-xrt</a></p>
]]></description><pubDate>Mon, 09 Mar 2026 01:29:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=47303765</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=47303765</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47303765</guid></item><item><title><![CDATA[New comment by VonTum in "The Singularity will occur on a Tuesday"]]></title><description><![CDATA[
<p>God Roko's Basilisk is the most boring AI risk to catch the public consciousness. It's just Pascal's wager all over again, with the exact same rebuttal.</p>
]]></description><pubDate>Tue, 10 Feb 2026 19:11:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=46965212</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46965212</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46965212</guid></item><item><title><![CDATA[New comment by VonTum in "Defining Safe Hardware Design [pdf]"]]></title><description><![CDATA[
<p>Oh hi Rachit, long time no see. I sadly didn't have time to submit something to LATTE this year as I've been spending all my time building infrastructure for SUS.<p>I think improving the safety of hardware design is a noble goal, and certainly there is much that can be improved over Verilog & VHDL's incredibly brittle baseline.<p>Though for dynamic latency safety, my intuition tells me the problem space is undecidable. Sure one could prove the correctness of various kinds of dynamic latency pipelines, and as research progresses you'll include more and more such constructs, but it'll always remain possible to construct a correct but unprovable dynamic pipeline.<p>Given that, shouldn't we take a leaf out of Rust's book, and instead give the user tools to build abstractions which internally contain unprovable but correct black magic, yet on their interface provide a safe, static latency count.<p>Take for instance SUS' SlowState. It abstracts over an internal state, and the user provides a pipeline to update this internal state. Now, if we were to update the state twice, before the change has had time to propagate through the pipeline, that would be an error. SlowState prevents you from doing so by statically measuring the length of the update pipeline, and only allowing updates once it has cleared. 
Implementing SlowState requires some unsafe, but it can provide a safe interface upholding its requirement.</p>
]]></description><pubDate>Wed, 04 Feb 2026 22:13:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=46892600</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46892600</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46892600</guid></item><item><title><![CDATA[New comment by VonTum in "Ask HN: Share your personal website"]]></title><description><![CDATA[
<p><a href="https://hirtum.com" rel="nofollow">https://hirtum.com</a></p>
]]></description><pubDate>Wed, 14 Jan 2026 19:10:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=46621083</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46621083</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46621083</guid></item><item><title><![CDATA[New comment by VonTum in "Fixing a Buffer Overflow in Unix v4 Like It's 1973"]]></title><description><![CDATA[
<p>The article specifically mentions this optimization as not working with the compiler at that time, hence the need for the separate index variable.<p>> We will edit su.c to prevent the overflow by maintaining a counter, i, and verifying it against the buffer size during the read loop. I initially attempted a fix using pointer arithmetic, but the 1973 C compiler didn’t like it, while it didn’t refuse the syntax, the code had no effect. I settled on a simpler index-based check instead.</p>
]]></description><pubDate>Sat, 10 Jan 2026 14:28:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=46565974</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46565974</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46565974</guid></item><item><title><![CDATA[New comment by VonTum in "FPGAs Need a New Future"]]></title><description><![CDATA[
<p>Well really, the language _is_ the difficulty of much of hardware design, both Verilog and VHDL are languages that were designed for simulation of hardware, and not synthesis of hardware. Both languages have of similar-but-not-quite ways of writing things, like blocking/nonblocking assigns causing incorrect behavior that's incredibly difficult to spot on the waveform, not being exhaustive in assigns in always blocks causing latches, maybe-synthesizeable for loops, etc. Most of this comes from their paradigm of an event loop, handling all events and the events that those events trigger, etc, until all are done, and advancing time until the next event. They simulate how the internal state of a chip changes every clock cycle, but not to actually do the designing of said chip itself.<p>I'm tooting my own horn with this, as I'm building my own language for doing the actual designing. It's called SUS.<p>Simple things look pretty much like C:<p><pre><code>  module add :
    int#(FROM:-8, TO: 8) a,
    int#(FROM: 2, TO: 20) b -> 
    int c {
    c = a+b
  }
</code></pre>
It automatically compensates for pipelining registers you add, and allows you to use this pipelining information in the type system.<p>It's a very young language, but me, a few of my colleagues, and some researchers in another university are already using it. Check it out => <a href="https://github.com/pc2/sus-compiler" rel="nofollow">https://github.com/pc2/sus-compiler</a></p>
]]></description><pubDate>Tue, 23 Dec 2025 01:19:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=46361322</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46361322</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46361322</guid></item><item><title><![CDATA[New comment by VonTum in "Waymo halts service during S.F. blackout after causing traffic jams"]]></title><description><![CDATA[
<p>I miss the time when "confused" for a computer program was meant in a humorous way.</p>
]]></description><pubDate>Sun, 21 Dec 2025 06:31:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=46342750</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46342750</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46342750</guid></item><item><title><![CDATA[New comment by VonTum in "Airbus to migrate critical apps to a sovereign Euro cloud"]]></title><description><![CDATA[
<p>Regulation is about setting minimum standards for acceptance, not specifying exactly how.<p>This means that if I walk into a random croissant shop and buy a croissant, I don't subsequently have 2 days of food poisoning.<p>Arguably, healthier being the default is also good. The less I personally need to think about this, the more I can think about other more useful things.</p>
]]></description><pubDate>Sun, 21 Dec 2025 02:17:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=46341652</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46341652</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46341652</guid></item><item><title><![CDATA[New comment by VonTum in "Thin desires are eating life"]]></title><description><![CDATA[
<p>What would be an example of "Wise wisdom"?</p>
]]></description><pubDate>Wed, 17 Dec 2025 10:35:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=46300328</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46300328</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46300328</guid></item><item><title><![CDATA[New comment by VonTum in "What is the nicest thing a stranger has ever done for you?"]]></title><description><![CDATA[
<p>Oh, I just came back from Shimla actually. I stayed in Narkanda for 2 days to do some hiking, and Shimla one day, though I didn't interact with many people there. My next stop is Kochi, hopefully things are also a little quieter there.</p>
]]></description><pubDate>Sat, 13 Dec 2025 18:22:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=46256669</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46256669</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46256669</guid></item><item><title><![CDATA[New comment by VonTum in "What is the nicest thing a stranger has ever done for you?"]]></title><description><![CDATA[
<p>Just now, I'm travelling through India, and today was particularily rough. (I'm trying to go from Delhi Airport to Agra). Multiple Ubers turned out bad (scams, no-show, or fucking with pickup point). I spent several hours in this limbo getting nowhere. I end up taking a train without ticket on advice of multiple people around me, since the counter refused to sell me one.<p>Turns out, wrong train, going slightly the wrong way. But a guy walks up to me in the train, asks me where I'm going, and starts to help me get to where I need to go. He arranged a bunk for me, talked to the conductor for me, bought(!) another train to Agra for me, called hostels in Agra, etc etc. I've had multiple such encounters here in India, of people going so far out of their way to help me here, something you would honestly never see in my country Germany. It's like a strange incongruence, with one fraction of the population hell-bent on fleecing you for all you've got, and another that will go way further out of their way for you than you could ever imagine.</p>
]]></description><pubDate>Sat, 13 Dec 2025 17:40:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=46256312</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46256312</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46256312</guid></item><item><title><![CDATA[New comment by VonTum in "Revisiting "Let's Build a Compiler""]]></title><description><![CDATA[
<p>Oh nono, with tree-sitter, you get an untyped syntax tree. That means, you have a Cursor object to walk the tree, which creates Node objects as you traverse, that have a "kind" (name of the tree-sitter node), span, and children. (I recommend using the rust tree-sitter bindings itself, not the rust wrapper rust-sitter).<p>Yes, portability like that is a huge benefit, though I personally utilized it for that yet. I just use it as an error-tolerant frontend to my compiler.<p>As to how errors are reported, tree-sitter creates an ERROR or MISSING node when a particular subtree has invalid syntax. I've found that it never leaves a node in an invalid state, (so never would it create a binaryop(LeftNode(...), Op, ERROR) if RightNode is not optional. Instead it would create an ERROR for binaryop too. This allows you to safely unwrap known fields. ERROR nodes only really bunch up in repeat() and optional()s where you would implicity handle them.<p>For an example, I can only point you to my own use: 
<a href="https://github.com/pc2/sus-compiler" rel="nofollow">https://github.com/pc2/sus-compiler</a><p>tree-sitter-sus has the grammar<p>sus-proc-macro has nice proc macros for dealing with it (kind!("binop"), field!("name"), etc)<p>src/flattening/parser.rs has conveniences like iterating over lists<p>and src/flattening/flatten.rs has the actual conversion from syntax tree to SUS IR</p>
]]></description><pubDate>Wed, 10 Dec 2025 15:56:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=46219238</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46219238</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46219238</guid></item><item><title><![CDATA[New comment by VonTum in "Do Not Optimize Away"]]></title><description><![CDATA[
<p>Printing the hash of the result is a nice trick I've used a couple of times myself, but jumping through the hoops of making the inputs parametrizeable (a la env vars) is only going to make your benchmarks less reliable, not more. It could be that the request for the env var gets moved past you let start = now() call, and therefore you're now partly benchmarking std::env::get().<p>Instead, stick with std::hint::black_box for both inputs and outputs. Your benchmark will have no overhead from them, and you're benchmarking exactly what you intend. For low-level benchmarks, use repeats (again with std::hint::black_box on independent loops, or a proper microbenchmarking framework</p>
]]></description><pubDate>Wed, 10 Dec 2025 14:28:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=46218080</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46218080</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46218080</guid></item><item><title><![CDATA[New comment by VonTum in "Revisiting "Let's Build a Compiler""]]></title><description><![CDATA[
<p>I've used tree-sitter for generating my parsers in Rust, and just working with the untyped syntax tree it generates, and gives you error-tolerance for free. It's a bit of a setup at first tho, requiring an extra crate for the generated parser, but editing it from there saves so much time.</p>
]]></description><pubDate>Wed, 10 Dec 2025 13:18:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=46217348</link><dc:creator>VonTum</dc:creator><comments>https://news.ycombinator.com/item?id=46217348</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46217348</guid></item></channel></rss>