/ xmlrom.vhd.in
xmlrom.vhd.in
  1  library IEEE;
  2  use std.textio.all;
  3  use IEEE.std_logic_1164.all;  -- defines std_logic types
  4  use IEEE.STD_LOGIC_ARITH.ALL;
  5  use IEEE.STD_LOGIC_UNSIGNED.ALL;
  6  use IEEE.STD_LOGIC_TEXTIO.ALL;
  7  
  8  use work.IDROMConst.all;
  9  use work.PIN_@PIN@.all;
 10  use work.@CARD@.all;
 11  use work.idrom_tools.all;
 12  
 13  entity xmlrom_@PIN@ is
 14  
 15  function GetPinDesc(i: integer) return PinDescRecord is
 16  begin
 17      return MakePinRecord(PinDesc(i));
 18  end function;
 19  
 20  procedure WriteTag(file f: TEXT; tname: string; tvalue: string) is
 21      variable so: line;
 22  begin
 23      write(so, string'("<"));
 24      write(so, tname);
 25      write(so, string'(">"));
 26      write(so, tvalue);
 27      write(so, string'("</"));
 28      write(so, tname);
 29      write(so, string'(">"));
 30      writeline(f, so);
 31  end procedure;
 32  
 33  procedure WriteTag(file f: TEXT; tname: string; tvalue: integer) is
 34      variable so: line;
 35  begin
 36      write(so, string'("<"));
 37      write(so, tname);
 38      write(so, string'(">"));
 39      write(so, tvalue, LEFT, 1);
 40      write(so, string'("</"));
 41      write(so, tname);
 42      write(so, string'(">"));
 43      writeline(f, so);
 44  end procedure;
 45  
 46  procedure WriteTagHex(file f: TEXT; tname: string; tvalue: integer) is
 47      variable so: line;
 48      variable h: string(1 to 8);
 49      variable v: integer;
 50      constant hexchars : string(1 to 16) := "0123456789abcdef";
 51  begin
 52      write(so, string'("<"));
 53      write(so, tname);
 54      write(so, string'(">0x"));
 55      v := tvalue;
 56      for i in 7 downto 0 loop
 57          h(i+1) := hexchars(v mod 16 + 1);
 58          v := v / 16;
 59      end loop;
 60      write(so, h);
 61      write(so, string'("</"));
 62      write(so, tname);
 63      write(so, string'(">"));
 64      writeline(f, so);
 65  end procedure;
 66  
 67  function b2i(v: boolean) return integer is
 68  begin
 69      if(v) then return 1; else return 0; end if;
 70  end function;
 71  
 72  end xmlrom_@PIN@;
 73  
 74  architecture bbb of xmlrom_@PIN@ is
 75      file output_file : TEXT open write_mode is in "/dev/stdout";
 76  begin
 77      process
 78          variable so: line;
 79          variable i: integer;
 80          variable mr : ModuleRecord;
 81          variable pr : PinDescRecord;
 82      begin
 83          write(so, string'("<?xml version=""1.0""?>"));
 84          writeline(output_file, so);
 85          write(so, string'("<hostmot2>"));
 86          writeline(output_file, so);
 87          WriteTag(output_file, string'("version"), 3);
 88          WriteTagHex(output_file, string'("vendor"),
 89              conv_integer(signed(BoardNameLow)));
 90          WriteTag(output_file, string'("vendorname"), BoardVendor(BoardNameLow));
 91          WriteTagHex(output_file, string'("board"),
 92              conv_integer(signed(BoardNameHigh)));
 93          WriteTag(output_file, string'("boardname"),
 94              BoardName(BoardNameLow, BoardNameHigh, PortWidth));
 95          WriteTag(output_file, string'("fpgasize"), conv_integer(fpgasize));
 96          WriteTag(output_file, string'("fpgapins"), conv_integer(fpgapins));
 97          WriteTag(output_file, string'("ioports"), conv_integer(ioports));
 98          WriteTag(output_file, string'("iowidth"), conv_integer(iowidth));
 99          WriteTag(output_file, string'("portwidth"), conv_integer(portwidth));
100          WriteTag(output_file, string'("ledcount"), conv_integer(ledcount));
101          WriteTag(output_file, string'("sepclocks"), b2i(sepclocks));
102          WriteTag(output_file, string'("onews"), b2i(onews));
103          WriteTag(output_file, string'("clocklow"), conv_integer(clocklow));
104          WriteTag(output_file, string'("clockhigh"), conv_integer(clockhigh));
105  --      WriteTag(output_file, string'("inststride0"),conv_integer(inststride0));
106  --      WriteTag(output_file, string'("inststride1"),conv_integer(inststride1));
107  --      WriteTag(output_file, string'("regstride0"), conv_integer(regstride0));
108  --      WriteTag(output_file, string'("regstride1"), conv_integer(regstride1));
109  
110          write(so, string'("<modules>"));
111          writeline(output_file, so);
112  
113          for i in 0 to MaxModules-1 loop
114              mr := ModuleId(i);
115              if(mr.GTag = NullTag) then
116                  exit;
117              end if;
118              write(so, string'("<module>"));
119              writeline(output_file, so);
120  
121              WriteTag(output_file, string'("index"), i);
122              WriteTag(output_file, string'("tag"),
123                  conv_integer(mr.GTag));
124              WriteTag(output_file, string'("tagname"),
125                  TagToName(mr.GTag));
126              WriteTag(output_file, string'("version"),
127                  conv_integer(mr.Version));
128              WriteTag(output_file, string'("numinstances"),
129                  conv_integer(mr.NumInstances));
130              WriteTag(output_file, string'("numregisters"),
131                  conv_integer(mr.NumRegisters));
132              WriteTag(output_file, string'("strides"),
133                  conv_integer(mr.Strides));
134              WriteTag(output_file, string'("multregs"),
135                  conv_integer(signed(mr.MultRegs)));
136              WriteTag(output_file, string'("baseaddr"),
137                  conv_integer(mr.BaseAddr));
138              WriteTag(output_file, string'("clock"),
139                  conv_integer(mr.Clock));
140  
141              write(so, string'("</module>"));
142          end loop;
143          write(so, string'("</modules>"));
144          writeline(output_file, so);
145  
146          write(so, string'("<pins>"));
147          for i in 0 to IOWidth-1 loop
148              write(so, string'("<pin>"));
149              writeline(output_file, so);
150  
151              WriteTag(output_file, string'("index"), i);
152  
153              pr := GetPinDesc(i);
154  
155              WriteTag(output_file, string'("connector"),
156                  Conn(BoardNameLow, BoardNameHigh, i, PortWidth));
157              if(PortWidth = 24) then
158                  WriteTag(output_file, string'("pinno"),
159                      conv_integer(i) mod 24*2+1);
160              elsif(PortWidth = 17) then
161                  WriteTag(output_file, string'("pinno"),
162                      conv_integer(i) mod 17+1);
163              end if;
164              WriteTag(output_file, "secondarymodule", conv_integer(pr.SecFunc));
165              WriteTag(output_file, "secondarymodulename", TagToName(pr.SecFunc));
166              WriteTag(output_file, "secondaryfunction", conv_integer(pr.SecPin));
167              WriteTag(output_file, "secondaryfunctionname",
168                  Funct(pr.SecFunc, pr.SecPin));
169  
170              if(pr.SecFunc /= NullTag) then
171                  if((pr.SecInst and x"80") /= 0) then
172                      WriteTag(output_file, "secondaryinstance", string'("ALL"));
173                  else
174                      WriteTag(output_file, "secondaryinstance",
175                          conv_integer(pr.SecInst));
176                  end if;
177              end if;
178  
179              write(so, string'("</pin>"));
180              writeline(output_file, so);
181          end loop;
182          write(so, string'("</pins>"));
183          writeline(output_file, so);
184          write(so, string'("</hostmot2>"));
185          writeline(output_file, so);
186  
187          wait;
188      end process;
189  end bbb;
190