Documentation
-- fake BSDL file for test purposes
-- Copyright 2026 Darrell Harmon
-- MIT license
 -- intentionally a bit messy to test whitespace variations

-- commment
        -- some tabs before a comment
-- maybe it has something that's not ASCII 💩

entity PDP_11 is

generic (PHYSICAL_PIN_MAP : string := "QFN_20" );

 -- comment

port (
	VDD: linkage bit_vector (1 to 4);
	GND: linkage bit;
	-- some have a comment in the middle of the port list
    CLK: in bit;
    RESET_N: in bit;
	D: inout bit_vector(0 to 3); -- bit vector on actual data is rare
    CSN: out bit;
    SCK: out bit;
	TMS: in bit;
	TCK: in bit;
	TDI: in bit;
	TDO: out bit;
    GT_RXN0: in bit;
    GT_RXP0: in bit;
    GT_TXN0: buffer bit;
    GT_TXP0: buffer bit
 );

use STD_1149_1_2001.all;
use STD_1149_6_2003.all;

attribute COMPONENT_CONFORMANCE of PDP_11 : entity is "STD_1149_1_2001";

attribute PIN_MAP of PDP_11 : entity is PHYSICAL_PIN_MAP;

constant QFN_20 : PIN_MAP_STRING :=
	"VDD: (" &
		"1, 2, 20, 19)," &
	"GND: 21," &
    "D: (3, 4, 5, 6),"&
    "RESET_N: 13," &
    "GT_RXP0: 14," &
    "GT_RXN0: 15," &
    "GT_TXP0: 16," &
    "GT_TXN0: 17," &
    "CLK: 18," &
    "SCK: 7," &
    "CSN: 8," &
	"TMS: 9," &
	"TCK: 10," &
	"TDI: 11," &
	"TDO: 12";

attribute PORT_GROUPING of PDP_11 : entity is
"DIFFERENTIAL_VOLTAGE (" &
"(GT_RXP0, GT_RXN0), " &
"(GT_TXP0, GT_TXN0))";

attribute TAP_SCAN_IN    of TDI : signal is true;
attribute TAP_SCAN_MODE  of TMS : signal is true;
attribute TAP_SCAN_OUT   of TDO : signal is true;
attribute TAP_SCAN_CLOCK of TCK : signal is (1234.56e6, BOTH);
attribute INSTRUCTION_LENGTH of PDP_11 : entity is 5;
attribute INSTRUCTION_OPCODE of PDP_11 : entity is
	"IDCODE					(00000)," &
	"BYPASS					(11111),"&
	"SAMPLE					(00001)," &
	"PRELOAD				(00010)," &
	"EXTEST					(00x11)," & -- we can have x bits in instructions
    "PRIVATE                (00000, 10000, 00100), "& -- we can have multiple opcodes per instruction
	"USER               	(00100)";

attribute INSTRUCTION_CAPTURE of PDP_11 : entity is "XXX01";
attribute IDCODE_REGISTER of PDP_11: entity is
"X001" &
"1000111001000111" &
"00000110101" & -- multiple IDCODEs are allowed
"1," &
"X001" &
"0000111001000111" &
"00000110101" & --
"1"; --

attribute INSTRUCTION_PRIVATE of PDP_11 : entity is "USER," & "PRIVATE";

attribute BOUNDARY_LENGTH of PDP_11 : entity is 18;

attribute BOUNDARY_REGISTER of PDP_11 : entity is
  "0 (BC_2 , *, control,  1)," &
  " 1 (  BC_7 , D(0), bidir   ,  X ,    0 ,   1   ,  Z )," &
  " 2 (  BC_2 ,    *        , control ,  1  )," &
  " 3 (  BC_7 , D(1) , bidir   ,  X ,    2 ,   1   ,  Z )," &
  " 4 (  BC_2 ,    *        , control ,  1  )," &
  " 5 (  BC_7 ,    D(2) , bidir   ,  X ,    4 ,   1   ,  Z )," &
  " 6 (BC_2, *, controlr, 1)," &
  " 7 (BC_2, D(3), output3, X, 6, 1, PULL1)," & --
  " 8 (BC_2, D(3), input, X)," & --
  " 9 (BC_2, RESET_N, input, X)," &
  " 10 (BC_4, CLK, OBSERVE_ONLY, X)," &
  "11 (BC_2 , *, control,  1)," &
  " 12 (BC_2, SCK, OUTPUT3, X, 11, 1, Z)," &
  "13 (BC_2 , *, control,  1)," &
  " 14 (BC_2, CSN, OUTPUT3, X, 13, 1, Z)," &
  " 15 (BC_2, GT_TXP0, OUTPUT2, X)," &
  " 16 (BC_4, GT_RXN0, OBSERVE_ONLY, X)," &
  " 17 (BC_4, GT_RXP0, OBSERVE_ONLY, X)";

attribute AIO_COMPONENT_CONFORMANCE of PDP_11 : entity is "STD_1149_6_2003";

attribute DESIGN_WARNING of PDP_11 : entity is
    "this part is fake.";

end PDP_11;