/*
 *  yosys -- Yosys Open SYnthesis Suite
 *
 *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at>
 *
 *  Permission to use, copy, modify, and/or distribute this software for any
 *  purpose with or without fee is hereby granted, provided that the above
 *  copyright notice and this permission notice appear in all copies.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 *  ---
 *
 *  A very simple and straightforward frontend for the RTLIL text
 *  representation (as generated by the 'ilang' backend).
 *
 */

%{

#ifdef __clang__
// bison generates code using the 'register' storage class specifier
#pragma clang diagnostic ignored "-Wdeprecated-register"
#endif

#include "frontends/ilang/ilang_frontend.h"
#include "ilang_parser.tab.hh"

USING_YOSYS_NAMESPACE

#define YY_INPUT(buf,result,max_size) \
	result = readsome(*ILANG_FRONTEND::lexin, buf, max_size)

%}

%option yylineno
%option noyywrap
%option nounput
%option prefix="rtlil_frontend_ilang_yy"

%x STRING

%%

"autoidx"	{ return TOK_AUTOIDX; }
"module"	{ return TOK_MODULE; }
"attribute"	{ return TOK_ATTRIBUTE; }
"parameter"	{ return TOK_PARAMETER; }
"signed"	{ return TOK_SIGNED; }
"real"		{ return TOK_REAL; }
"wire"		{ return TOK_WIRE; }
"memory"	{ return TOK_MEMORY; }
"width"		{ return TOK_WIDTH; }
"upto"		{ return TOK_UPTO; }
"offset"	{ return TOK_OFFSET; }
"size"		{ return TOK_SIZE; }
"input"		{ return TOK_INPUT; }
"output"	{ return TOK_OUTPUT; }
"inout"		{ return TOK_INOUT; }
"cell"		{ return TOK_CELL; }
"connect"	{ return TOK_CONNECT; }
"switch"	{ return TOK_SWITCH; }
"case"		{ return TOK_CASE; }
"assign"	{ return TOK_ASSIGN; }
"sync"		{ return TOK_SYNC; }
"low"		{ return TOK_LOW; }
"high"		{ return TOK_HIGH; }
"posedge"	{ return TOK_POSEDGE; }
"negedge"	{ return TOK_NEGEDGE; }
"edge"		{ return TOK_EDGE; }
"always"	{ return TOK_ALWAYS; }
"global"	{ return TOK_GLOBAL; }
"init"		{ return TOK_INIT; }
"update"	{ return TOK_UPDATE; }
"process"	{ return TOK_PROCESS; }
"end"		{ return TOK_END; }

[a-z]+		{ return TOK_INVALID; }

"\\"[^ \t\r\n]+		{ rtlil_frontend_ilang_yylval.string = strdup(yytext); return TOK_ID; }
"$"[^ \t\r\n]+		{ rtlil_frontend_ilang_yylval.string = strdup(yytext); return TOK_ID; }
"."[0-9]+		{ rtlil_frontend_ilang_yylval.string = strdup(yytext); return TOK_ID; }

[0-9]+'[01xzm-]*	{ rtlil_frontend_ilang_yylval.string = strdup(yytext); return TOK_VALUE; }
-?[0-9]+		{ rtlil_frontend_ilang_yylval.integer = atoi(yytext); return TOK_INT; }

\"		{ BEGIN(STRING); }
<STRING>\\.	{ yymore(); }
<STRING>\"	{
	BEGIN(0);
	char *yystr = strdup(yytext);
	yystr[strlen(yytext) - 1] = 0;
	int i = 0, j = 0;
	while (yystr[i]) {
		if (yystr[i] == '\\' && yystr[i + 1]) {
			i++;
			if (yystr[i] == 'n')
				yystr[i] = '\n';
			else if (yystr[i] == 't')
				yystr[i] = '\t';
			else if ('0' <= yystr[i] && yystr[i] <= '7') {
				yystr[i] = yystr[i] - '0';
				if ('0' <= yystr[i + 1] && yystr[i + 1] <= '7') {
					yystr[i + 1] = yystr[i] * 8 + yystr[i + 1] - '0';
					i++;
				}
				if ('0' <= yystr[i + 1] && yystr[i + 1] <= '7') {
					yystr[i + 1] = yystr[i] * 8 + yystr[i + 1] - '0';
					i++;
				}
			}
		}
		yystr[j++] = yystr[i++];
	}
	yystr[j] = 0;
	rtlil_frontend_ilang_yylval.string = yystr;
	return TOK_STRING;
}
<STRING>.	{ yymore(); }

"#"[^\n]*	/* ignore comments */
[ \t]		/* ignore non-newline whitespaces */
[\r\n]+		{ return TOK_EOL; }

.               { return *yytext; }

%%

// this is a hack to avoid the 'yyinput defined but not used' error msgs
void *rtlil_frontend_ilang_avoid_input_warnings() {
	return (void*)&yyinput;
}

