aboutsummaryrefslogtreecommitdiffstats
path: root/frontends/verilog/verilog_frontend.h
Commit message (Collapse)AuthorAgeFilesLines
* verilog: Squash a memory leak.Marcelina Kościelnicka2021-06-141-1/+1
| | | | That was added in ecc22f7fedfa639482dbc55a05709da85116a60f
* Fixing old e-mail addresses and deadnamesClaire Xenia Wolf2021-06-081-1/+1
| | | | | | | | s/((Claire|Xen|Xenia|Clifford)\s+)+(Wolf|Xen)\s+<(claire|clifford)@(symbioticeda.com|clifford.at|yosyshq.com)>/Claire Xenia Wolf <claire@yosyshq.com>/gi; s/((Nina|Nak|N\.)\s+)+Engelhardt\s+<nak@(symbioticeda.com|yosyshq.com)>/N. Engelhardt <nak@yosyshq.com>/gi; s/((David)\s+)+Shah\s+<(dave|david)@(symbioticeda.com|yosyshq.com|ds0.me)>/David Shah <dave@ds0.me>/gi; s/((Miodrag)\s+)+Milanovic\s+<(miodrag|micko)@(symbioticeda.com|yosyshq.com)>/Miodrag Milanovic <micko@yosyshq.com>/gi; s,https?://www.clifford.at/yosys/,http://yosyshq.net/yosys/,g;
* frontend: cleanup to use more ID::*, more dict<> instead of map<>Eddie Hung2020-05-041-1/+1
|
* Merge pull request #1811 from PeterCrozier/typedef_scopeN. Engelhardt2020-03-301-2/+3
|\ | | | | Support module/package/interface/block scope for typedef names.
| * Support module/package/interface/block scope for typedef names.Peter Crozier2020-03-231-2/+3
| |
* | Add support for SystemVerilog-style `define to Verilog frontendRupert Swarbrick2020-03-271-4/+0
|/ | | | | | | | | | | | | | | | | | | | | | | | | | | This patch should support things like `define foo(a, b = 3, c) a+b+c `foo(1, ,2) which will evaluate to 1+3+2. It also spots mistakes like `foo(1) (the 3rd argument doesn't have a default value, so a call site is required to set it). Most of the patch is a simple parser for the format in preproc.cc, but I've also taken the opportunity to wrap up the "name -> definition" map in a type, rather than use multiple std::map's. Since this type needs to be visible to code that touches defines, I've pulled it (and the frontend_verilog_preproc declaration) out into a new file at frontends/verilog/preproc.h and included that where necessary. Finally, the patch adds a few tests in tests/various to check that we are parsing everything correctly.
* Parser changes to support typedef.Peter2020-03-221-0/+6
|
* Closes #1717. Add more precise Verilog source location information to AST ↵Alberto Gonzalez2020-02-231-1/+0
| | | | and RTLIL nodes.
* Add specify parserClifford Wolf2019-04-231-5/+2
| | | | Signed-off-by: Clifford Wolf <clifford@clifford.at>
* New behavior for front-end handling of whiteboxesClifford Wolf2019-04-201-2/+5
| | | | Signed-off-by: Clifford Wolf <clifford@clifford.at>
* Add "whitebox" attribute, add "read_verilog -wb"Clifford Wolf2019-04-181-0/+3
| | | | Signed-off-by: Clifford Wolf <clifford@clifford.at>
* Add "read_verilog -noassert -noassume -assert-assumes"Clifford Wolf2018-09-241-0/+9
| | | | Signed-off-by: Clifford Wolf <clifford@clifford.at>
* Remember global declarations and defines accross read_verilog callsClifford Wolf2016-11-151-1/+2
|
* Added read_verilog -norestrict -assume-assertsClifford Wolf2016-08-261-0/+6
|
* No tristate warning message for "read_verilog -lib"Clifford Wolf2016-07-231-0/+3
|
* Fixed trailing whitespacesClifford Wolf2015-07-021-2/+2
|
* Added non-std verilog assume() statementClifford Wolf2015-02-261-0/+3
|
* Added warning for use of 'z' constants in HDLClifford Wolf2014-11-141-1/+1
|
* Changed frontend-api from FILE to std::istreamClifford Wolf2014-08-231-1/+4
|
* Moved some stuff to kernel/yosys.{h,cc}, using Yosys:: namespaceClifford Wolf2014-07-311-1/+5
|
* Added read_verilog -sv options, added support for bit, logic,Clifford Wolf2014-06-121-0/+3
| | | | allways_ff, always_comb, and always_latch
* Added Verilog support for "`default_nettype none"Clifford Wolf2014-02-171-0/+3
|
* Enable {* .. *} feature per default (removes dependency to REJECT feature in ↵Clifford Wolf2013-11-221-3/+0
| | | | flex)
* Added support for include directories with the new '-I' argument of theJohann Glaser2013-08-201-1/+2
| | | | 'read_verilog' command
* added option '-Dname[=definition]' to command 'read_verilog'Johann Glaser2013-05-191-1/+1
|
* initial importClifford Wolf2013-01-051-0/+62
laration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/*
 *  lzo.c -- LZO1X Compressor from MiniLZO
 *
 *  Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <markus@oberhumer.com>
 *
 *  The full LZO package can be found at:
 *  http://www.oberhumer.com/opensource/lzo/
 *
 *  Adapted for Xen (files combined and syntactic/header changes) by:
 *  Dan Magenheimer <dan.magenheimer@oracle.com>
 *
 */

/*
 *  lzodefs.h -- architecture, OS and compiler specific defines
 *
 *  Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <markus@oberhumer.com>
 *
 *  The full LZO package can be found at:
 *  http://www.oberhumer.com/opensource/lzo/
 *
 *  Changed for kernel use by:
 *  Nitin Gupta <nitingupta910@gmail.com>
 *  Richard Purdie <rpurdie@openedhand.com>
 */

#define LZO_VERSION  0x2020
#define LZO_VERSION_STRING "2.02"
#define LZO_VERSION_DATE "Oct 17 2005"

#define M1_MAX_OFFSET 0x0400
#define M2_MAX_OFFSET 0x0800
#define M3_MAX_OFFSET 0x4000
#define M4_MAX_OFFSET 0xbfff

#define M1_MIN_LEN 2
#define M1_MAX_LEN 2
#define M2_MIN_LEN 3
#define M2_MAX_LEN 8
#define M3_MIN_LEN 3
#define M3_MAX_LEN 33
#define M4_MIN_LEN 3
#define M4_MAX_LEN 9

#define M1_MARKER 0
#define M2_MARKER 64
#define M3_MARKER 32
#define M4_MARKER 16

#define D_BITS  14
#define D_MASK  ((1u << D_BITS) - 1)
#define D_HIGH  ((D_MASK >> 1) + 1)

#define DX2(p, s1, s2) (((((size_t)((p)[2]) << (s2)) ^ (p)[1]) \
       << (s1)) ^ (p)[0])
#define DX3(p, s1, s2, s3) ((DX2((p)+1, s2, s3) << (s1)) ^ (p)[0])

/*
 *  LZO1X Compressor from MiniLZO
 *
 *  Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <markus@oberhumer.com>
 *
 *  The full LZO package can be found at:
 *  http://www.oberhumer.com/opensource/lzo/
 *
 *  Changed for kernel use by:
 *  Nitin Gupta <nitingupta910@gmail.com>
 *  Richard Purdie <rpurdie@openedhand.com>
 */

#include <xen/types.h>
#include <xen/lzo.h>
#define get_unaligned(_p) (*(_p))
#define put_unaligned(_val,_p) (*(_p)=_val)
#define get_unaligned_le16(_p) (*(u16 *)(_p))

static noinline size_t
_lzo1x_1_do_compress(const unsigned char *in, size_t in_len,
                     unsigned char *out, size_t *out_len, void *wrkmem)
{
    const unsigned char * const in_end = in + in_len;
    const unsigned char * const ip_end = in + in_len - M2_MAX_LEN - 5;
    const unsigned char ** const dict = wrkmem;
    const unsigned char *ip = in, *ii = ip;
    const unsigned char *end, *m, *m_pos;
    size_t m_off, m_len, dindex;
    unsigned char *op = out;

    ip += 4;

    for (;;) {
        dindex = ((size_t)(0x21 * DX3(ip, 5, 5, 6)) >> 5) & D_MASK;
        m_pos = dict[dindex];

        if (m_pos < in)
            goto literal;

        if (ip == m_pos || ((size_t)(ip - m_pos) > M4_MAX_OFFSET))
            goto literal;

        m_off = ip - m_pos;
        if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3])
            goto try_match;

        dindex = (dindex & (D_MASK & 0x7ff)) ^ (D_HIGH | 0x1f);
        m_pos = dict[dindex];

        if (m_pos < in)
            goto literal;

        if (ip == m_pos || ((size_t)(ip - m_pos) > M4_MAX_OFFSET))
            goto literal;

        m_off = ip - m_pos;
        if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3])
            goto try_match;

        goto literal;

    try_match:
        if (get_unaligned((const unsigned short *)m_pos)
            == get_unaligned((const unsigned short *)ip)) {
            if (likely(m_pos[2] == ip[2]))
                goto match;
        }

    literal:
        dict[dindex] = ip;
        ++ip;
        if (unlikely(ip >= ip_end))
            break;
        continue;

    match:
        dict[dindex] = ip;
        if (ip != ii) {
            size_t t = ip - ii;

            if (t <= 3) {
                op[-2] |= t;
            } else if (t <= 18) {
                *op++ = (t - 3);
            } else {
                size_t tt = t - 18;

                *op++ = 0;
                while (tt > 255) {
                    tt -= 255;
                    *op++ = 0;
                }
                *op++ = tt;
            }
            do {
                *op++ = *ii++;
            } while (--t > 0);
        }

        ip += 3;
        if (m_pos[3] != *ip++ || m_pos[4] != *ip++
            || m_pos[5] != *ip++ || m_pos[6] != *ip++
            || m_pos[7] != *ip++ || m_pos[8] != *ip++) {
            --ip;
            m_len = ip - ii;

            if (m_off <= M2_MAX_OFFSET) {
                m_off -= 1;
                *op++ = (((m_len - 1) << 5)
                         | ((m_off & 7) << 2));
                *op++ = (m_off >> 3);
            } else if (m_off <= M3_MAX_OFFSET) {
                m_off -= 1;
                *op++ = (M3_MARKER | (m_len - 2));
                goto m3_m4_offset;
            } else {
                m_off -= 0x4000;

                *op++ = (M4_MARKER | ((m_off & 0x4000) >> 11)
                         | (m_len - 2));
                goto m3_m4_offset;
            }
        } else {
            end = in_end;
            m = m_pos + M2_MAX_LEN + 1;

            while (ip < end && *m == *ip) {
                m++;
                ip++;
            }
            m_len = ip - ii;

            if (m_off <= M3_MAX_OFFSET) {
                m_off -= 1;
                if (m_len <= 33) {
                    *op++ = (M3_MARKER | (m_len - 2));
                } else {
                    m_len -= 33;
                    *op++ = M3_MARKER | 0;
                    goto m3_m4_len;
                }
            } else {
                m_off -= 0x4000;
                if (m_len <= M4_MAX_LEN) {
                    *op++ = (M4_MARKER
                             | ((m_off & 0x4000) >> 11)
                             | (m_len - 2));
                } else {
                    m_len -= M4_MAX_LEN;
                    *op++ = (M4_MARKER
                             | ((m_off & 0x4000) >> 11));
                m3_m4_len:
                    while (m_len > 255) {
                        m_len -= 255;
                        *op++ = 0;
                    }

                    *op++ = (m_len);
                }
            }
        m3_m4_offset:
            *op++ = ((m_off & 63) << 2);
            *op++ = (m_off >> 6);
        }

        ii = ip;
        if (unlikely(ip >= ip_end))
            break;
    }

    *out_len = op - out;
    return in_end - ii;
}

int lzo1x_1_compress(const unsigned char *in, size_t in_len, unsigned char *out,
                     size_t *out_len, void *wrkmem)
{
    const unsigned char *ii;
    unsigned char *op = out;
    size_t t;

    if (unlikely(in_len <= M2_MAX_LEN + 5)) {
        t = in_len;
    } else {
        t = _lzo1x_1_do_compress(in, in_len, op, out_len, wrkmem);
        op += *out_len;
    }

    if (t > 0) {
        ii = in + in_len - t;

        if (op == out && t <= 238) {
            *op++ = (17 + t);
        } else if (t <= 3) {
            op[-2] |= t;
        } else if (t <= 18) {
            *op++ = (t - 3);
        } else {
            size_t tt = t - 18;

            *op++ = 0;
            while (tt > 255) {
                tt -= 255;
                *op++ = 0;
            }

            *op++ = tt;
        }
        do {
            *op++ = *ii++;
        } while (--t > 0);
    }

    *op++ = M4_MARKER | 1;
    *op++ = 0;
    *op++ = 0;

    *out_len = op - out;
    return LZO_E_OK;
}

/*
 *  LZO1X Decompressor from MiniLZO
 *
 *  Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <markus@oberhumer.com>
 *
 *  The full LZO package can be found at:
 *  http://www.oberhumer.com/opensource/lzo/
 *
 *  Changed for kernel use by:
 *  Nitin Gupta <nitingupta910@gmail.com>
 *  Richard Purdie <rpurdie@openedhand.com>
 */

#define HAVE_IP(x, ip_end, ip) ((size_t)(ip_end - ip) < (x))
#define HAVE_OP(x, op_end, op) ((size_t)(op_end - op) < (x))
#define HAVE_LB(m_pos, out, op) (m_pos < out || m_pos >= op)

#define COPY4(dst, src) \
  put_unaligned(get_unaligned((const u32 *)(src)), (u32 *)(dst))

int lzo1x_decompress_safe(const unsigned char *in, size_t in_len,
                          unsigned char *out, size_t *out_len)
{
    const unsigned char * const ip_end = in + in_len;
    unsigned char * const op_end = out + *out_len;
    const unsigned char *ip = in, *m_pos;
    unsigned char *op = out;
    size_t t;

    *out_len = 0;

    if (*ip > 17) {
        t = *ip++ - 17;
        if (t < 4)
            goto match_next;
        if (HAVE_OP(t, op_end, op))
            goto output_overrun;
        if (HAVE_IP(t + 1, ip_end, ip))
            goto input_overrun;
        do {
            *op++ = *ip++;
        } while (--t > 0);
        goto first_literal_run;
    }

    while ((ip < ip_end)) {
        t = *ip++;
        if (t >= 16)
            goto match;
        if (t == 0) {
            if (HAVE_IP(1, ip_end, ip))
                goto input_overrun;
            while (*ip == 0) {
                t += 255;
                ip++;
                if (HAVE_IP(1, ip_end, ip))
                    goto input_overrun;
            }
            t += 15 + *ip++;
        }
        if (HAVE_OP(t + 3, op_end, op))
            goto output_overrun;
        if (HAVE_IP(t + 4, ip_end, ip))
            goto input_overrun;

        COPY4(op, ip);
        op += 4;
        ip += 4;
        if (--t > 0) {
            if (t >= 4) {
                do {
                    COPY4(op, ip);
                    op += 4;
                    ip += 4;
                    t -= 4;
                } while (t >= 4);
                if (t > 0) {
                    do {
                        *op++ = *ip++;
                    } while (--t > 0);
                }
            } else {
                do {
                    *op++ = *ip++;
                } while (--t > 0);
            }
        }

    first_literal_run:
        t = *ip++;
        if (t >= 16)
            goto match;
        m_pos = op - (1 + M2_MAX_OFFSET);
        m_pos -= t >> 2;
        m_pos -= *ip++ << 2;

        if (HAVE_LB(m_pos, out, op))
            goto lookbehind_overrun;

        if (HAVE_OP(3, op_end, op))
            goto output_overrun;
        *op++ = *m_pos++;
        *op++ = *m_pos++;
        *op++ = *m_pos;

        goto match_done;

        do {
        match:
            if (t >= 64) {
                m_pos = op - 1;
                m_pos -= (t >> 2) & 7;
                m_pos -= *ip++ << 3;
                t = (t >> 5) - 1;
                if (HAVE_LB(m_pos, out, op))
                    goto lookbehind_overrun;
                if (HAVE_OP(t + 3 - 1, op_end, op))
                    goto output_overrun;
                goto copy_match;
            } else if (t >= 32) {
                t &= 31;
                if (t == 0) {
                    if (HAVE_IP(1, ip_end, ip))
                        goto input_overrun;
                    while (*ip == 0) {
                        t += 255;
                        ip++;
                        if (HAVE_IP(1, ip_end, ip))
                            goto input_overrun;
                    }
                    t += 31 + *ip++;
                }
                m_pos = op - 1;
                m_pos -= get_unaligned_le16(ip) >> 2;
                ip += 2;
            } else if (t >= 16) {
                m_pos = op;
                m_pos -= (t & 8) << 11;

                t &= 7;
                if (t == 0) {
                    if (HAVE_IP(1, ip_end, ip))
                        goto input_overrun;
                    while (*ip == 0) {
                        t += 255;
                        ip++;
                        if (HAVE_IP(1, ip_end, ip))
                            goto input_overrun;
                    }
                    t += 7 + *ip++;
                }
                m_pos -= get_unaligned_le16(ip) >> 2;
                ip += 2;
                if (m_pos == op)
                    goto eof_found;
                m_pos -= 0x4000;
            } else {
                m_pos = op - 1;
                m_pos -= t >> 2;
                m_pos -= *ip++ << 2;

                if (HAVE_LB(m_pos, out, op))
                    goto lookbehind_overrun;
                if (HAVE_OP(2, op_end, op))
                    goto output_overrun;

                *op++ = *m_pos++;
                *op++ = *m_pos;
                goto match_done;
            }

            if (HAVE_LB(m_pos, out, op))
                goto lookbehind_overrun;
            if (HAVE_OP(t + 3 - 1, op_end, op))
                goto output_overrun;

            if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) {
                COPY4(op, m_pos);
                op += 4;
                m_pos += 4;
                t -= 4 - (3 - 1);
                do {
                    COPY4(op, m_pos);
                    op += 4;
                    m_pos += 4;
                    t -= 4;
                } while (t >= 4);
                if (t > 0)
                    do {
                        *op++ = *m_pos++;
                    } while (--t > 0);
            } else {
            copy_match:
                *op++ = *m_pos++;
                *op++ = *m_pos++;
                do {
                    *op++ = *m_pos++;
                } while (--t > 0);
            }
        match_done:
            t = ip[-2] & 3;
            if (t == 0)
                break;
        match_next:
            if (HAVE_OP(t, op_end, op))
                goto output_overrun;
            if (HAVE_IP(t + 1, ip_end, ip))
                goto input_overrun;

            *op++ = *ip++;
            if (t > 1) {
                *op++ = *ip++;
                if (t > 2)
                    *op++ = *ip++;
            }

            t = *ip++;
        } while (ip < ip_end);
    }

    *out_len = op - out;
    return LZO_E_EOF_NOT_FOUND;

 eof_found:
    *out_len = op - out;
    return (ip == ip_end ? LZO_E_OK :
            (ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN));
 input_overrun:
    *out_len = op - out;
    return LZO_E_INPUT_OVERRUN;

 output_overrun:
    *out_len = op - out;
    return LZO_E_OUTPUT_OVERRUN;

 lookbehind_overrun:
    *out_len = op - out;
    return LZO_E_LOOKBEHIND_OVERRUN;
}