aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth/netlists-errors.adb
blob: 7d3bbd93c4f27ef7b77ce3fa6e16d0cbd4458356 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
--  Error handling for synthesis.
--  Copyright (C) 2017 Tristan Gingold
--
--  This file is part of GHDL.
--
--  This program is free software: you can redistribute it and/or modify
--  it under the terms of the GNU General Public License as published by
--  the Free Software Foundation, either version 2 of the License, or
--  (at your option) any later version.
--
--  This program is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--  GNU General Public License for more details.
--
--  You should have received a copy of the GNU General Public License
--  along with this program.  If not, see <gnu.org/licenses>.

package body Netlists.Errors is
   function "+" (N : Instance) return Earg_Type is
   begin
      return Make_Earg_Synth_Instance (Uns32 (N));
   end "+";

   function "+" (N : Net) return Earg_Type is
   begin
      return Make_Earg_Synth_Net (Uns32 (N));
   end "+";

   function "+" (N : Sname) return Earg_Type is
   begin
      return Make_Earg_Synth_Name (Uns32 (N));
   end "+";

   procedure Output_Name_1 (N : Sname)
   is
      Prefix : Sname;
   begin
      --  Do not crash on No_Name.
      if N = No_Sname then
         Output_Message ("*nil*");
         return;
      end if;

      Prefix := Get_Sname_Prefix (N);
      if Prefix /= No_Sname then
         Output_Name_1 (Prefix);
         Output_Message (".");
      end if;

      case Get_Sname_Kind (N) is
         when Sname_User =>
            Output_Identifier (Get_Sname_Suffix (N));
         when Sname_Artificial =>
            Output_Identifier (Get_Sname_Suffix (N));
         when Sname_Version =>
            Output_Message ("n");
            Output_Uns32 (Get_Sname_Version (N));
      end case;
   end Output_Name_1;

   procedure Output_Name (N : Sname) is
   begin
      Output_Message ("""");
      Output_Name_1 (N);
      Output_Message ("""");
   end Output_Name;

   procedure Synth_Instance_Handler
     (Format : Character; Err : Error_Record; Val : Uns32)
   is
      pragma Unreferenced (Err);
      Inst : constant Instance := Instance (Val);
   begin
      case Format is
         when 'n' =>
            Output_Name (Get_Instance_Name (Inst));
         when 'i' =>
            Output_Message ("i");
            Output_Uns32 (Uns32 (Inst));
         when others =>
            raise Internal_Error;
      end case;
   end Synth_Instance_Handler;

   procedure Synth_Net_Handler
     (Format : Character; Err : Error_Record; Val : Uns32)
   is
      pragma Unreferenced (Err);
      N : constant Net := Net (Val);
   begin
      case Format is
         when 'n' =>
            declare
               Inst : constant Instance := Get_Net_Parent (N);
               Idx : constant Port_Idx := Get_Port_Idx (N);
               Name : Sname;
            begin
               if Is_Self_Instance (Inst) then
                  Name := Get_Input_Desc (Get_Module (Inst), Idx).Name;
               else
                  Name := Get_Output_Desc (Get_Module (Inst), Idx).Name;
               end if;
               Output_Name (Name);
            end;
         when others =>
            raise Internal_Error;
      end case;
   end Synth_Net_Handler;

   procedure Synth_Name_Handler
     (Format : Character; Err : Error_Record; Val : Uns32)
   is
      pragma Unreferenced (Err);
      N : constant Sname := Sname (Val);
   begin
      if Format = 'n' then
         Output_Name (N);
      else
         raise Internal_Error;
      end if;
   end Synth_Name_Handler;

   procedure Initialize is
   begin
      Register_Earg_Handler
        (Earg_Synth_Instance, Synth_Instance_Handler'Access);
      Register_Earg_Handler
        (Earg_Synth_Net, Synth_Net_Handler'Access);
      Register_Earg_Handler
        (Earg_Synth_Name, Synth_Name_Handler'Access);
   end Initialize;
end Netlists.Errors;
"o"><= 125: return length elif length >= 126 and length <= 65535: return 126 else: return 127 def __repr__(self): vals = [ "ws frame:", OPCODE.get_name(self.opcode, hex(self.opcode)).lower() ] flags = [] for i in ["fin", "rsv1", "rsv2", "rsv3", "mask"]: if getattr(self, i): flags.append(i) if flags: vals.extend([":", "|".join(flags)]) if self.masking_key: vals.append(":key=%s" % repr(self.masking_key)) if self.payload_length: vals.append(" %s" % human.pretty_size(self.payload_length)) return "".join(vals) def human_readable(self): warnings.warn("FrameHeader.to_bytes is deprecated, use bytes(frame_header) instead.", DeprecationWarning) return repr(self) def __bytes__(self): first_byte = utils.setbit(0, 7, self.fin) first_byte = utils.setbit(first_byte, 6, self.rsv1) first_byte = utils.setbit(first_byte, 5, self.rsv2) first_byte = utils.setbit(first_byte, 4, self.rsv3) first_byte = first_byte | self.opcode second_byte = utils.setbit(self.length_code, 7, self.mask) b = six.int2byte(first_byte) + six.int2byte(second_byte) if self.payload_length < 126: pass elif self.payload_length < MAX_16_BIT_INT: # '!H' pack as 16 bit unsigned short # add 2 byte extended payload length b += struct.pack('!H', self.payload_length) elif self.payload_length < MAX_64_BIT_INT: # '!Q' = pack as 64 bit unsigned long long # add 8 bytes extended payload length b += struct.pack('!Q', self.payload_length) if self.masking_key: b += self.masking_key return b if six.PY2: __str__ = __bytes__ def to_bytes(self): warnings.warn("FrameHeader.to_bytes is deprecated, use bytes(frame_header) instead.", DeprecationWarning) return bytes(self) @classmethod def from_file(cls, fp): """ read a websockets frame header """ first_byte = six.byte2int(fp.safe_read(1)) second_byte = six.byte2int(fp.safe_read(1)) fin = utils.getbit(first_byte, 7) rsv1 = utils.getbit(first_byte, 6) rsv2 = utils.getbit(first_byte, 5) rsv3 = utils.getbit(first_byte, 4) # grab right-most 4 bits opcode = first_byte & 15 mask_bit = utils.getbit(second_byte, 7) # grab the next 7 bits length_code = second_byte & 127 # payload_lengthy > 125 indicates you need to read more bytes # to get the actual payload length if length_code <= 125: payload_length = length_code elif length_code == 126: payload_length, = struct.unpack("!H", fp.safe_read(2)) elif length_code == 127: payload_length, = struct.unpack("!Q", fp.safe_read(8)) # masking key only present if mask bit set if mask_bit == 1: masking_key = fp.safe_read(4) else: masking_key = None return cls( fin=fin, rsv1=rsv1, rsv2=rsv2, rsv3=rsv3, opcode=opcode, mask=mask_bit, length_code=length_code, payload_length=payload_length, masking_key=masking_key, ) def __eq__(self, other): if isinstance(other, FrameHeader): return bytes(self) == bytes(other) return False class Frame(object): """ Represents one websockets frame. Constructor takes human readable forms of the frame components from_bytes() is also avaliable. WebSockets Frame as defined in RFC6455 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-------+-+-------------+-------------------------------+ |F|R|R|R| opcode|M| Payload len | Extended payload length | |I|S|S|S| (4) |A| (7) | (16/64) | |N|V|V|V| |S| | (if payload len==126/127) | | |1|2|3| |K| | | +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + | Extended payload length continued, if payload len == 127 | + - - - - - - - - - - - - - - - +-------------------------------+ | |Masking-key, if MASK set to 1 | +-------------------------------+-------------------------------+ | Masking-key (continued) | Payload Data | +-------------------------------- - - - - - - - - - - - - - - - + : Payload Data continued ... : + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | Payload Data continued ... | +---------------------------------------------------------------+ """ def __init__(self, payload=b"", **kwargs): self.payload = payload kwargs["payload_length"] = kwargs.get("payload_length", len(payload)) self.header = FrameHeader(**kwargs) @classmethod def default(cls, message, from_client=False): """ Construct a basic websocket frame from some default values. Creates a non-fragmented text frame. """ if from_client: mask_bit = 1 masking_key = os.urandom(4) else: mask_bit = 0 masking_key = None return cls( message, fin=1, # final frame opcode=OPCODE.TEXT, # text mask=mask_bit, masking_key=masking_key, ) @classmethod def from_bytes(cls, bytestring): """ Construct a websocket frame from an in-memory bytestring to construct a frame from a stream of bytes, use from_file() directly """ return cls.from_file(tcp.Reader(io.BytesIO(bytestring))) def __repr__(self): ret = repr(self.header) if self.payload: ret = ret + "\nPayload:\n" + strutils.clean_bin(self.payload) return ret def human_readable(self): warnings.warn("Frame.to_bytes is deprecated, use bytes(frame) instead.", DeprecationWarning) return repr(self) def __bytes__(self): """ Serialize the frame to wire format. Returns a string. """ b = bytes(self.header) if self.header.masking_key: b += protocol.Masker(self.header.masking_key)(self.payload) else: b += self.payload return b if six.PY2: __str__ = __bytes__ def to_bytes(self): warnings.warn("FrameHeader.to_bytes is deprecated, use bytes(frame_header) instead.", DeprecationWarning) return bytes(self) def to_file(self, writer): warnings.warn("Frame.to_file is deprecated, use wfile.write(bytes(frame)) instead.", DeprecationWarning) writer.write(bytes(self)) writer.flush() @classmethod def from_file(cls, fp): """ read a websockets frame sent by a server or client fp is a "file like" object that could be backed by a network stream or a disk or an in memory stream reader """ header = FrameHeader.from_file(fp) payload = fp.safe_read(header.payload_length) if header.mask == 1 and header.masking_key: payload = protocol.Masker(header.masking_key)(payload) return cls( payload, fin=header.fin, opcode=header.opcode, mask=header.mask, payload_length=header.payload_length, masking_key=header.masking_key, rsv1=header.rsv1, rsv2=header.rsv2, rsv3=header.rsv3, length_code=header.length_code ) def __eq__(self, other): if isinstance(other, Frame): return bytes(self) == bytes(other) return False