[16:50][Define Example16 as a left shifter module][:"logic design"]
[18:47][Check out our left shifter graph][:"debug visualisation" :"logic design" :run]
[19:21][Instantiate a 16-bit shifter and check out its graph][:"debug visualisation" :"logic design" :run]
[20:43][Define Mux4 module][:"logic design"]
[22:43][Introduce left_shifter_radix2() and left_shifter_radix4() based on our original left_shifter()][:"logic design"]
[25:25][Define Example17 using left_shifter_radix4()][:"logic design"]
[25:48][Check out the graph to find that left_shifter_radix4() does not work][:"debug visualisation" :"logic design" :run]
[27:18][Redefine Example17 using just mux4()][:"logic design"]
[27:48][Check out the mux4 graph to see that that works][:"debug visualisation" :"logic design" :run]
[28:00][Fix left_shifter_radix4() to loop over the correct range][:"logic design"]
[28:43][Check out the left_shifter_radix4() graph][:"debug visualisation" :"logic design" :run]
[29:38][Instantiate a 32-bit shifter, and enable left_shifter_radix4() to handle odd-numbered shift bits][:"logic design"]
[31:01][Check out the graph to see that it is not as expected][:"debug visualisation" :"logic design" :run]
[31:22][Change left_shifter_radix4() to handle odd-numbered shift bits inside its loop][:"logic design"]
[32:00][Check out the graph of our 32-bit left shifter][:"debug visualisation" :"logic design" :run]
[32:32][Reflect on our single logarithmic shifter, with a brief mention of linear shifters][:"logic design" :speech]
[33:44][Right-shifting, both logical and arithmetic][:"logic design" :speech]
[35:27][Q&A][:speech]
[35:43][@rygorous][The typical array / linear shifter layout does not have N layers. Instead you basically have N layers "deep" of tristate drivers on one long wire, and only one of them is active, the rest is Z. So that's not N layers deep of logic, basically one layer][:"logic design"]
[36:16][Recommend Mean and Conway's 'Introduction to VLSI systems'[ref
[1:22:02][@rygorous][@pervognsen Don't you really need a mux? Since you need to either clear or set the upper bits, neither AND nor OR by itself can work][:"logic design"]
[1:22:32][Enable barrel_arithmetic_right_shifter() to mux between clearing and setting the upper bits][:"logic design"]
[1:24:54][Simulate the barrel_arithmetic_right_shifter() on a signed input to find that it works][:emulation :"logic design" :run]
[1:25:04][Introduce barrel_shifter() as our first combined design][:"logic design"]
[1:35:34][Define Example23 as a unified barrel shifter][:"logic design"]
[1:37:26][Simulate our unified barrel shifter on left- and right-rotations and left-shift, to find that they all work][:emulation :"logic design" :programming :run]
[1:40:06][Simulate right-shift to find that it doesn't work, and investigate why][:emulation :"logic design" :run]
[1:42:00][Print the mask of barrel_shifter()][:"logic design"]
[1:42:55][@rygorous][@pervognsen But now you're passing in \~n (from the first mux) when dir=1][:"logic design"]
[1:43:05][Enable barrel_shifter() to correctly perform right-shift][:"logic design"]
[1:43:44][Simulate the barrel shifter on right-shift, and pass the test][:emulation :"logic design" :run]
[1:44:05][Simulate the barrel shifter on arithmetic shift, and pass][:emulation :"logic design" :run]
[1:44:40][@rygorous][@pervognsen Basically, for the rotate case, just force mask to all-1s and delete the output mux][:"logic design"]
[1:44:48][Change barrel_shifter() to force the mask to all 1s and delete the output mux in the rotate case][:"logic design"]
[1:45:46][Simulate it to find that it works][:emulation :"logic design" :run]
[1:50:03][Check out the left_rotator_radix4 graph to see that it looks reasonable][:"debug visualisation" :"logic design" :run]
[1:50:33][Instantiate an 8-bit rotator and check out its graph][:"debug visualisation" :"logic design" :run]
[1:52:10][Test barrel_shifter() using both left_rotator_radix2() and left_rotator_radix4() to see that it works][:emulation :"logic design" :programming :run]
[1:53:03][Check out the graph of our unified barrel shifter][:"debug visualisation" :"logic design" :run]
[1:53:20][@rygorous][@pervognsen Why m1, m2, m3 and not m,2*m,3*m?]
[1:53:26][Rewrite left_rotator_radix4() as per @rygorous's suggestion]
[1:53:55][Consult the graph of our unified barrel shifter][:"debug visualisation" :"logic design" :run]
[1:54:34][Instantiate a 16-bit barrel shifter and check out its graph, noting the importance of the mask being off the critical path][:"debug visualisation" :"logic design" :run]
[1:57:54][@rygorous][@pervognsen Other things: 1. Bit-reversal shifters! 2. Funnel shifters!][:"logic design"]
[2:18:19][@rygorous][@pervognsen You need to be careful with the opposite-direction shifts later (so if you do a right shift funnel, look at the left shift)][:"logic design"]
[2:18:33][Simulate a funnel left shifter to see that it fails][:emulation :"logic design" :run]
[2:28:35][Simulate the funnel left rotator and fail the test][:emulation :"logic design" :run]
[2:28:54][@rygorous][@pervognsen I think x\[1:\], but yeah][:"logic design"]
[2:29:03][Fix funnel_left_rotator() to slice off the correct bit][:"logic design"]
[2:29:09][Simulate the funnel left rotator successfully][:emulation :"logic design" :run]
[2:29:17][Introduce funnel_shifter_unit() as a combined design][:"logic design"]
[2:31:15][@rygorous][@pervognsen You probably want to cut the slices into three pieces: hi 31, middle, lo 31. That way each of the pieces needs fewer options (instead of having a big full-width mux)][:"logic design"]
[2:31:27][Q&A][:speech]
[2:32:09][@tw0st3p][Question for an after hours stream: Have you heard of Julia :language?]
[2:32:50][Try to time the :performance of our barrel shifter, modifying get_operator_delay() to handle the necessary operators][:profiling]
[2:34:38][Check out the delay of our barrel shifter][:"logic design" :performance :run]