@@ -289,6 +289,49 @@ static void ProcessBuiltinChip(SimChip chip)
289289 PinState . Set8BitFrom4BitSources ( ref out8 . State , in4B . State , in4A . State ) ;
290290 break ;
291291 }
292+ case ChipType . Merge_1To16Bit :
293+ {
294+ uint stateA = chip . InputPins [ 15 ] . State & PinState . SingleBitMask ; // lsb
295+ uint stateB = chip . InputPins [ 14 ] . State & PinState . SingleBitMask ;
296+ uint stateC = chip . InputPins [ 13 ] . State & PinState . SingleBitMask ;
297+ uint stateD = chip . InputPins [ 12 ] . State & PinState . SingleBitMask ;
298+ uint stateE = chip . InputPins [ 11 ] . State & PinState . SingleBitMask ;
299+ uint stateF = chip . InputPins [ 10 ] . State & PinState . SingleBitMask ;
300+ uint stateG = chip . InputPins [ 9 ] . State & PinState . SingleBitMask ;
301+ uint stateH = chip . InputPins [ 8 ] . State & PinState . SingleBitMask ;
302+ uint stateI = chip . InputPins [ 7 ] . State & PinState . SingleBitMask ;
303+ uint stateJ = chip . InputPins [ 6 ] . State & PinState . SingleBitMask ;
304+ uint stateK = chip . InputPins [ 5 ] . State & PinState . SingleBitMask ;
305+ uint stateL = chip . InputPins [ 4 ] . State & PinState . SingleBitMask ;
306+ uint stateM = chip . InputPins [ 3 ] . State & PinState . SingleBitMask ;
307+ uint stateN = chip . InputPins [ 2 ] . State & PinState . SingleBitMask ;
308+ uint stateO = chip . InputPins [ 1 ] . State & PinState . SingleBitMask ;
309+ uint stateP = chip . InputPins [ 0 ] . State & PinState . SingleBitMask ;
310+ chip . OutputPins [ 0 ] . State = stateA | stateB << 1 | stateC << 2
311+ | stateD << 3 | stateE << 4 | stateF << 5 | stateG << 6
312+ | stateH << 7 | stateI << 8 | stateJ << 9 | stateK << 10
313+ | stateL << 11 | stateM << 12 | stateN << 13 | stateO << 14
314+ | stateP << 15 ;
315+ break ;
316+ }
317+ case ChipType . Merge_4To16Bit :
318+ {
319+ SimPin in4A = chip . InputPins [ 0 ] ;
320+ SimPin in4B = chip . InputPins [ 1 ] ;
321+ SimPin in4C = chip . InputPins [ 2 ] ;
322+ SimPin in4D = chip . InputPins [ 3 ] ;
323+ SimPin out16 = chip . OutputPins [ 0 ] ;
324+ PinState . Set16BitFrom4BitSources ( ref out16 . State , in4D . State , in4C . State , in4B . State , in4A . State ) ;
325+ break ;
326+ }
327+ case ChipType . Merge_8To16Bit :
328+ {
329+ SimPin in8A = chip . InputPins [ 0 ] ;
330+ SimPin in8B = chip . InputPins [ 1 ] ;
331+ SimPin out16 = chip . OutputPins [ 0 ] ;
332+ PinState . Set16BitFrom8BitSources ( ref out16 . State , in8B . State , in8A . State ) ;
333+ break ;
334+ }
292335 case ChipType . Split_8To4Bit :
293336 {
294337 SimPin in8 = chip . InputPins [ 0 ] ;
@@ -311,6 +354,49 @@ static void ProcessBuiltinChip(SimChip chip)
311354 chip . OutputPins [ 7 ] . State = ( in8 >> 0 ) & PinState . SingleBitMask ;
312355 break ;
313356 }
357+ case ChipType . Split_16To1Bit :
358+ {
359+ uint in16 = chip . InputPins [ 0 ] . State ;
360+ chip . OutputPins [ 0 ] . State = ( in16 >> 15 ) & PinState . SingleBitMask ;
361+ chip . OutputPins [ 1 ] . State = ( in16 >> 14 ) & PinState . SingleBitMask ;
362+ chip . OutputPins [ 2 ] . State = ( in16 >> 13 ) & PinState . SingleBitMask ;
363+ chip . OutputPins [ 3 ] . State = ( in16 >> 12 ) & PinState . SingleBitMask ;
364+ chip . OutputPins [ 4 ] . State = ( in16 >> 11 ) & PinState . SingleBitMask ;
365+ chip . OutputPins [ 5 ] . State = ( in16 >> 10 ) & PinState . SingleBitMask ;
366+ chip . OutputPins [ 6 ] . State = ( in16 >> 9 ) & PinState . SingleBitMask ;
367+ chip . OutputPins [ 7 ] . State = ( in16 >> 8 ) & PinState . SingleBitMask ;
368+ chip . OutputPins [ 8 ] . State = ( in16 >> 7 ) & PinState . SingleBitMask ;
369+ chip . OutputPins [ 9 ] . State = ( in16 >> 6 ) & PinState . SingleBitMask ;
370+ chip . OutputPins [ 10 ] . State = ( in16 >> 5 ) & PinState . SingleBitMask ;
371+ chip . OutputPins [ 11 ] . State = ( in16 >> 4 ) & PinState . SingleBitMask ;
372+ chip . OutputPins [ 12 ] . State = ( in16 >> 3 ) & PinState . SingleBitMask ;
373+ chip . OutputPins [ 13 ] . State = ( in16 >> 2 ) & PinState . SingleBitMask ;
374+ chip . OutputPins [ 14 ] . State = ( in16 >> 1 ) & PinState . SingleBitMask ;
375+ chip . OutputPins [ 15 ] . State = ( in16 >> 0 ) & PinState . SingleBitMask ;
376+ break ;
377+ }
378+ case ChipType . Split_16To4Bit :
379+ {
380+ SimPin in16 = chip . InputPins [ 0 ] ;
381+ SimPin out4A = chip . OutputPins [ 0 ] ;
382+ SimPin out4B = chip . OutputPins [ 1 ] ;
383+ SimPin out4C = chip . OutputPins [ 2 ] ;
384+ SimPin out4D = chip . OutputPins [ 3 ] ;
385+ PinState . Set4BitFrom16BitSource ( ref out4A . State , in16 . State , 3 ) ;
386+ PinState . Set4BitFrom16BitSource ( ref out4B . State , in16 . State , 2 ) ;
387+ PinState . Set4BitFrom16BitSource ( ref out4C . State , in16 . State , 1 ) ;
388+ PinState . Set4BitFrom16BitSource ( ref out4D . State , in16 . State , 0 ) ;
389+ break ;
390+ }
391+ case ChipType . Split_16To8Bit :
392+ {
393+ SimPin in16 = chip . InputPins [ 0 ] ;
394+ SimPin out8A = chip . OutputPins [ 0 ] ;
395+ SimPin out8B = chip . OutputPins [ 1 ] ;
396+ PinState . Set4BitFrom8BitSource ( ref out8A . State , in16 . State , false ) ;
397+ PinState . Set4BitFrom8BitSource ( ref out8B . State , in16 . State , true ) ;
398+ break ;
399+ }
314400 case ChipType . TriStateBuffer :
315401 {
316402 SimPin dataPin = chip . InputPins [ 0 ] ;
0 commit comments