URL
https://opencores.org/ocsvn/sc2v/sc2v/trunk
Subversion Repositories sc2v
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 27 to Rev 28
- ↔ Reverse comparison
Rev 27 → Rev 28
/trunk/ChangeLog
1,23 → 1,31
20-05-2005 Version 0.4.4 |
|
Fix bug using comments with -- and ++ operators |
Fix bug inferring regs with arrays |
Fix bug when using defines inside case statements |
Fix bug using comments |
Fix bug when assigning defines to variables |
|
18-05-2005 Version 0.4.3 |
|
Corrected bug using ? and _ in header file |
Corrected bug using multiple pointer declarations in header file |
Fix bug using ? and _ in header file |
Fix bug using multiple pointer declarations in header file |
Added #ifndef to implementation file |
|
18-03-2005 Version 0.4.2 |
|
Corrected bug in hexadecimal numbers in case statatements |
Corrected bug in type conversions |
Corrected bug in array length |
Corrected bug in process without variables declaration |
Fix bug in hexadecimal numbers in case statatements |
Fix bug in type conversions |
Fix bug in array length |
Fix bug in process without variables declaration |
|
15-03-2005 Version 0.4.1 |
|
Corrected bug with <= comparation |
Fix bug with <= comparation |
for loops with int type as index supported |
Support hex numbers in switchs |
Support sc_signals arrays |
Corrected bug when connecting a output port to another |
Fix bug when connecting a output port to another |
Solved problem in type conversions |
Solved problem with enumeration list |
Solved bug in nested switch statements |
30,7 → 38,7
|
Contribution of Harald Devos: |
Line number in syntax error |
ShowSignalsList arguments corrected |
ShowSignalsList arguments Fix |
|
03-02-2005 Version 0.3 |
|
47,24 → 55,24
23-01-2005 Version 0.2.4 |
|
Contribution of Harald Devos: |
Corrected Memory allocation problems |
Corrected return -1 in list.c |
Fix Memory allocation problems |
Fix return -1 in list.c |
|
20-01-2005 Version 0.2.3 |
|
Corrected Memory allocation problems |
Fix Memory allocation problems |
Ignore SystemC type conversions |
|
18-01-2005 Version 0.2.2 |
|
Contribution of Harald Devos: |
Corrected bug when using keywords in comments |
Fix bug when using keywords in comments |
Adding multilines with \ |
|
|
17-01-2005 Version 0.2.1 |
|
Corrected bug in else if |
Fix bug in else if |
Translate true and false into 1 and 0 |
|
|
/trunk/src/sc2v_step1.y
58,8 → 58,8
int defineinvocationfound = 0; |
int opencorchfound = 0; |
int defineparenthesis = 0; |
|
int openedcase = 0; |
int writingvar=0; |
|
int default_break_found = 0; |
int default_found; |
127,7 → 127,7
%token COLON SEMICOLON RANGE OPENPAR CLOSEPAR TWODOUBLEPOINTS OPENCORCH CLOSECORCH SWITCH CASE DEFAULT BREAK |
%token HEXA DEFINE READ TRANSLATEOFF TRANSLATEON VERILOGBEGIN VERILOGEND TAB DOLLAR MINEQ |
%token VOID TTRUE TFALSE ENDFUNC INC DEC INTEGER EQUALS |
%token PIFDEF PIFNDEF PENDDEF PELSE |
%token PIFDEF PIFNDEF PENDDEF PELSE COMMENT |
|
%% commands: /* empty */ |
|commands command; |
238,7 → 238,9
| |
equal |
| |
minorequal; |
minorequal |
| |
comment; |
|
minorequal: |
MINEQ |
524,6 → 526,10
defineparenthesis = 0; |
if (translate == 1 && verilog == 0) |
{ |
if(opencorchfound==0){ |
strcpy (lastword, (char *) $1); |
} |
|
if (processfound) |
{ |
if(lastswitch){ |
539,9 → 545,7
openedcase=0; |
} |
|
strcpy (lastword, (char *) $1); |
|
if (reg_found) |
if (reg_found) |
{ |
if(writelenght){ |
writelenght=0; |
662,8 → 666,9
reg_found=0; |
if (translate == 1 && verilog == 0) |
{ |
if (processfound) |
if (processfound) |
fprintf (file, "="); |
writingvar=1; |
} |
else if (definefound) |
fprintf (FILE_DEFINES, "="); |
700,6 → 705,7
NEWLINE |
{ |
defineparenthesis = 0; |
writingvar=0; |
if (translate == 1 && verilog == 0) |
{ |
if (processfound & !reg_found & !openedcase) |
756,8 → 762,8
} |
else |
{ |
if (defineinvocationfound == 0) |
fprintf (file, ";"); |
if (defineinvocationfound == 0 || writingvar) |
fprintf (file, ";"); |
} |
} |
else if (definefound) |
767,7 → 773,8
} |
else if (verilog == 1) |
fprintf (file, ";"); |
|
|
writingvar=0; |
defineinvocationfound = 0; |
}; |
|
829,10 → 836,10
{ |
if (processfound) |
{ |
opencorchfound = 1; |
if (reg_found) |
{ |
fprintf (regs_file, "["); |
opencorchfound = 1; |
} |
else |
fprintf (file, "["); |
854,11 → 861,11
if (translate == 1 && verilog == 0) |
{ |
if (processfound) |
{ |
{ |
opencorchfound = 0; |
if (reg_found) |
{ |
fprintf (regs_file, "]"); |
opencorchfound = 0; |
} |
else |
fprintf (file, "]"); |
1146,11 → 1153,17
if (!openedcase) |
for (i = 0; i < openedkeys; i++) |
fprintf (file, " "); |
if (openedcase) |
fprintf (file, ", %s", (char *) $2); |
else |
fprintf (file, "%s", (char *) $2); |
|
if (openedcase){ |
if (IsDefine (defineslist, (char *) $2)) |
fprintf (file, ", `%s", (char *) $2); |
else |
fprintf (file, ", %s", (char *) $2); |
}else{ |
if (IsDefine (defineslist, (char *) $2)) |
fprintf (file, "`%s", (char *) $2); |
else |
fprintf (file, "%s", (char *) $2); |
} |
newline = 1; |
openedcase = 1; |
|
1374,3 → 1387,27
else if (verilog == 1) |
fprintf (file, "0"); |
}; |
|
comment: |
COMMENT |
{ |
if(processfound){ |
//To manage comments inside switch statements |
if(lastswitch){ |
openedcase=0; |
}else if (openedcase){ |
fprintf (file, " :\n"); |
for (i = 0; i < openedkeys; i++) |
fprintf (file, " "); |
fprintf(file,"begin\n"); |
openedcase=0; |
} |
//indent |
if(newline){ |
for (i = 0; i < openedkeys; i++) |
fprintf (file, " "); |
newline=0; |
} |
fprintf (file, " %s", (char *)$1); |
} |
} |
/trunk/src/sc2v_step1.l
38,59 → 38,59
%} |
|
%% |
"void" if(!includefound & !linecomment & !multilinecomment) return VOID; else {yylval=(int)strdup(yytext);} return WORD; |
"true" if(!includefound & !linecomment & !multilinecomment) return TTRUE; else {yylval=(int)strdup(yytext);} return WORD; |
"false" if(!includefound & !linecomment & !multilinecomment) return TFALSE; else {yylval=(int)strdup(yytext);} return WORD; |
"void" if(!includefound & !linecomment & !multilinecomment) return VOID; else {yylval=(int)strdup(yytext);} return COMMENT; |
"true" if(!includefound & !linecomment & !multilinecomment) return TTRUE; else {yylval=(int)strdup(yytext);} return COMMENT; |
"false" if(!includefound & !linecomment & !multilinecomment) return TFALSE; else {yylval=(int)strdup(yytext);} return COMMENT; |
[0-9]+ yylval=atoi(yytext); return NUMBER; |
"::" if(!includefound & !linecomment & !multilinecomment) return TWODOUBLEPOINTS; else {yylval=(int)strdup(yytext);} return WORD; |
"int" if(!includefound & !linecomment & !multilinecomment) return INTEGER; else {yylval=(int)strdup(yytext);} return WORD; |
sc_int if(!includefound & !linecomment & !multilinecomment) return SC_REG; else {yylval=(int)strdup(yytext);} return WORD; |
sc_uint if(!includefound & !linecomment & !multilinecomment) return SC_REG; else {yylval=(int)strdup(yytext);} return WORD; |
sc_bigint if(!includefound & !linecomment & !multilinecomment) return SC_REG; else {yylval=(int)strdup(yytext);} return WORD; |
sc_biguint if(!includefound & !linecomment & !multilinecomment) return SC_REG; else {yylval=(int)strdup(yytext);} return WORD; |
bool if(!includefound & !linecomment & !multilinecomment) return BOOL; else {yylval=(int)strdup(yytext);} return WORD; |
">" if(!includefound & !linecomment & !multilinecomment) return BIGGER; else {yylval=(int)strdup(yytext);} return WORD; |
"<" if(!includefound & !linecomment & !multilinecomment) return LOWER; else {yylval=(int)strdup(yytext);} return WORD; |
"{" if(!includefound & !linecomment & !multilinecomment) return OPENKEY; else {yylval=(int)strdup(yytext);} return WORD; |
"}" if(!includefound & !linecomment & !multilinecomment) return CLOSEKEY; else {yylval=(int)strdup(yytext);} return WORD; |
"(" if(!includefound & !linecomment & !multilinecomment) return OPENPAR; else {yylval=(int)strdup(yytext);} return WORD; |
")" if(!includefound & !linecomment & !multilinecomment) return CLOSEPAR; else {yylval=(int)strdup(yytext);} return WORD; |
"[" if(!includefound & !linecomment & !multilinecomment) return OPENCORCH; else {yylval=(int)strdup(yytext);} return WORD; |
"]" if(!includefound & !linecomment & !multilinecomment) return CLOSECORCH; else {yylval=(int)strdup(yytext);} return WORD; |
"return" if(!includefound & !linecomment & !multilinecomment) return ENDFUNC; else {yylval=(int)strdup(yytext);} return WORD; |
".write" if(!includefound & !linecomment & !multilinecomment) return WRITE; else {yylval=(int)strdup(yytext);} return WORD; |
"switch" if(!includefound & !linecomment & !multilinecomment) return SWITCH; else {yylval=(int)strdup(yytext);} return WORD; |
"case" if(!includefound & !linecomment & !multilinecomment) return CASE; else {yylval=(int)strdup(yytext);} return WORD; |
"default" if(!includefound & !linecomment & !multilinecomment) return DEFAULT; else {yylval=(int)strdup(yytext);} return WORD; |
"break" if(!includefound & !linecomment & !multilinecomment) return BREAK; else {yylval=(int)strdup(yytext);} return WORD; |
".read" if(!includefound & !linecomment & !multilinecomment) return READ; else {yylval=(int)strdup(yytext);} return WORD; |
".range" if(!includefound & !linecomment & !multilinecomment) return RANGE; else {yylval=(int)strdup(yytext);} return WORD; |
[a-zA-Z][_a-zA-Z0-9]* yylval=(int)strdup(yytext); return WORD; |
[.:"^"!%()/+*_"&""?""|""\\"] yylval=(int)strdup(yytext); return SYMBOL; |
"<=" yylval=(int)strdup(yytext); return MINEQ; |
"=" yylval=(int)strdup(yytext); return EQUALS; |
"++" yylval=(int)strdup(yytext); return INC; |
"--" yylval=(int)strdup(yytext); return DEC; |
"-" yylval=(int)strdup(yytext); return SYMBOL; |
"~" yylval=(int)strdup(yytext); return SYMBOL; |
"@" yylval=(int)strdup(yytext); return SYMBOL; |
"," if(!includefound & !linecomment & !multilinecomment) return COLON; else {yylval=(int)strdup(yytext);} return WORD; |
";" if(!includefound & !linecomment & !multilinecomment) return SEMICOLON; else {yylval=(int)strdup(yytext);} return WORD; |
"::" if(!includefound & !linecomment & !multilinecomment) return TWODOUBLEPOINTS; else {yylval=(int)strdup(yytext);} return COMMENT; |
"int" if(!includefound & !linecomment & !multilinecomment) return INTEGER; else {yylval=(int)strdup(yytext);} return COMMENT; |
sc_int if(!includefound & !linecomment & !multilinecomment) return SC_REG; else {yylval=(int)strdup(yytext);} return COMMENT; |
sc_uint if(!includefound & !linecomment & !multilinecomment) return SC_REG; else {yylval=(int)strdup(yytext);} return COMMENT; |
sc_bigint if(!includefound & !linecomment & !multilinecomment) return SC_REG; else {yylval=(int)strdup(yytext);} return COMMENT; |
sc_biguint if(!includefound & !linecomment & !multilinecomment) return SC_REG; else {yylval=(int)strdup(yytext);} return COMMENT; |
bool if(!includefound & !linecomment & !multilinecomment) return BOOL; else {yylval=(int)strdup(yytext);} return COMMENT; |
">" if(!includefound & !linecomment & !multilinecomment) return BIGGER; else {yylval=(int)strdup(yytext);} return COMMENT; |
"<" if(!includefound & !linecomment & !multilinecomment) return LOWER; else {yylval=(int)strdup(yytext);} return COMMENT; |
"{" if(!includefound & !linecomment & !multilinecomment) return OPENKEY; else {yylval=(int)strdup(yytext);} return COMMENT; |
"}" if(!includefound & !linecomment & !multilinecomment) return CLOSEKEY; else {yylval=(int)strdup(yytext);} return COMMENT; |
"(" if(!includefound & !linecomment & !multilinecomment) return OPENPAR; else {yylval=(int)strdup(yytext);} return COMMENT; |
")" if(!includefound & !linecomment & !multilinecomment) return CLOSEPAR; else {yylval=(int)strdup(yytext);} return COMMENT; |
"[" if(!includefound & !linecomment & !multilinecomment) return OPENCORCH; else {yylval=(int)strdup(yytext);} return COMMENT; |
"]" if(!includefound & !linecomment & !multilinecomment) return CLOSECORCH; else {yylval=(int)strdup(yytext);} return COMMENT; |
"return" if(!includefound & !linecomment & !multilinecomment) return ENDFUNC; else {yylval=(int)strdup(yytext);} return COMMENT; |
".write" if(!includefound & !linecomment & !multilinecomment) return WRITE; else {yylval=(int)strdup(yytext);} return COMMENT; |
"switch" if(!includefound & !linecomment & !multilinecomment) return SWITCH; else {yylval=(int)strdup(yytext);} return COMMENT; |
"case" if(!includefound & !linecomment & !multilinecomment) return CASE; else {yylval=(int)strdup(yytext);} return COMMENT; |
"default" if(!includefound & !linecomment & !multilinecomment) return DEFAULT; else {yylval=(int)strdup(yytext);} return COMMENT; |
"break" if(!includefound & !linecomment & !multilinecomment) return BREAK; else {yylval=(int)strdup(yytext);} return COMMENT; |
".read" if(!includefound & !linecomment & !multilinecomment) return READ; else {yylval=(int)strdup(yytext);} return COMMENT; |
".range" if(!includefound & !linecomment & !multilinecomment) return RANGE; else {yylval=(int)strdup(yytext);} return COMMENT; |
[a-zA-Z][_a-zA-Z0-9]* yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return WORD; else return COMMENT; |
[.:^!%/+*_"&""?""|""\\"] yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return SYMBOL; else return COMMENT; |
"<=" yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return MINEQ; else return COMMENT; |
"=" yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return EQUALS; else return COMMENT; |
"++" yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return INC; else return COMMENT; |
"--" yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return DEC; else return COMMENT; |
"-" yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return SYMBOL; else return COMMENT; |
"~" yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return SYMBOL; else return COMMENT; |
"@" yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return SYMBOL; else return COMMENT; |
"," yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return COLON; else return COMMENT; |
";" yylval=(int)strdup(yytext); if(!includefound & !linecomment & !multilinecomment) return SEMICOLON; else return COMMENT; |
[" "]+ /*Ignore white spaces*/ |
"\t" return TAB; /*Ignore Tab*/ |
"\n" lineno++; if (linecomment) linecomment=0; else if(includefound) includefound=0; return NEWLINE; |
"\\\n" lineno++; /* no new line */ |
"0x" if(!includefound & !linecomment & !multilinecomment) return HEXA; else {yylval=(int)strdup(yytext);} return WORD; |
"$" if(!includefound & !linecomment & !multilinecomment) return DOLLAR; else {yylval=(int)strdup(yytext);} return WORD;/* Ignore if(!includefound & !linecomment & !multilinecomment) $ */ |
"#define" if(!includefound & !linecomment & !multilinecomment) return DEFINE; else {yylval=(int)strdup(yytext);} return WORD; |
"0x" if(!includefound & !linecomment & !multilinecomment) return HEXA; else {yylval=(int)strdup(yytext);} return COMMENT; |
"$" if(!includefound & !linecomment & !multilinecomment) return DOLLAR; else {yylval=(int)strdup(yytext);} return COMMENT;/* Ignore if(!includefound & !linecomment & !multilinecomment) $ */ |
"#define" if(!includefound & !linecomment & !multilinecomment) return DEFINE; else {yylval=(int)strdup(yytext);} return COMMENT; |
"#include" includefound = 1; |
"#ifdef" if(!includefound & !linecomment & !multilinecomment) return PIFDEF; else {yylval=(int)strdup(yytext);} return WORD; |
"#ifndef" if(!includefound & !linecomment & !multilinecomment) return PIFNDEF; else {yylval=(int)strdup(yytext);} return WORD; |
"#else" if(!includefound & !linecomment & !multilinecomment) return PELSE; else {yylval=(int)strdup(yytext);} return WORD; |
"#endif" if(!includefound & !linecomment & !multilinecomment) return PENDDEF; else {yylval=(int)strdup(yytext);} return WORD; |
"//" if (!multilinecomment) linecomment = 1; yylval=(int)strdup(yytext); return WORD; |
"/*" if (!linecomment) multilinecomment = 1; yylval=(int)strdup(yytext); return WORD; |
"*/" if (multilinecomment) multilinecomment = 0; yylval=(int)strdup(yytext); return WORD; |
"#ifdef" if(!includefound & !linecomment & !multilinecomment) return PIFDEF; else {yylval=(int)strdup(yytext);} return COMMENT; |
"#ifndef" if(!includefound & !linecomment & !multilinecomment) return PIFNDEF; else {yylval=(int)strdup(yytext);} return COMMENT; |
"#else" if(!includefound & !linecomment & !multilinecomment) return PELSE; else {yylval=(int)strdup(yytext);} return COMMENT; |
"#endif" if(!includefound & !linecomment & !multilinecomment) return PENDDEF; else {yylval=(int)strdup(yytext);} return COMMENT; |
"//" if (!multilinecomment) linecomment = 1; yylval=(int)strdup(yytext); return COMMENT; |
"/*" if (!linecomment) multilinecomment = 1; yylval=(int)strdup(yytext); return COMMENT; |
"*/" if (multilinecomment) multilinecomment = 0; yylval=(int)strdup(yytext); return COMMENT; |
|
"("[ ]*"sc_uint"[ ]*"<"[ ]*[0-9]+[ ]*">"[ ]*")" |
"("[ ]*"sc_biguint"[ ]*"<"[ ]*[0-9]+[ ]*">"[ ]*")" |
/trunk/src/sc2v_step2.l
95,15 → 95,8
"//" if (!multilinecomment) linecomment = 1; |
"/*" if (!linecomment) multilinecomment = 1; |
"*/" if (multilinecomment) multilinecomment = 0; |
"/" /* ignore */ |
"-" |
"#" |
"@" |
"|" |
"~" |
"_" |
"?" |
|
[.:~@#^!%/+*_"&""?""|""\\"] |
|
"("[ ]*"sc_uint"[ ]*"<"[ ]*[0-9]+[ ]*">"[ ]*")" |
"("[ ]*"sc_biguint"[ ]*"<"[ ]*[0-9]+[ ]*">"[ ]*")" |
/trunk/Makefile
18,7 → 18,7
|
test: |
cd src; make all |
cd examples; ../bin/sc2v.sh dummy1; ../bin/sc2v.sh dummy2 ;../bin/sc2v.sh delay_line; ../bin/sc2v.sh stmach_k;../bin/sc2v.sh rng; ../bin/sc2v.sh md5; ../bin/sc2v.sh half_adder; ../bin/sc2v.sh full_adder; echo ""; echo "sc2v translated the following files successfully"; echo ""; ls -l *.v |
cd examples; ../bin/sc2v.sh subbytes;../bin/sc2v.sh sc_ex1; ../bin/sc2v.sh sp_512x32; ../bin/sc2v.sh dummy1; ../bin/sc2v.sh dummy2 ;../bin/sc2v.sh delay_line; ../bin/sc2v.sh stmach_k;../bin/sc2v.sh rng; ../bin/sc2v.sh md5; ../bin/sc2v.sh half_adder; ../bin/sc2v.sh full_adder; echo ""; echo "sc2v translated the following files successfully"; echo ""; ls -l *.v |
|
docs: |
cd src; doxygen doxygen.cfg |
/trunk/examples/subbytes.cpp
43,6 → 43,13
// CVS Revision History |
// |
// $Log: not supported by cvs2svn $ |
// Revision 1.3 2005/03/16 18:12:25 jcastillo |
// |
// Style modifications |
// |
// Revision 1.1 2005/01/26 16:51:06 jcastillo |
// New examples for 0.2.5 version |
// |
// Revision 1.2 2004/08/30 14:44:44 jcastillo |
// Code Formater used to give better appearance to SystemC code |
// |
/trunk/examples/subbytes.h
43,6 → 43,13
// CVS Revision History |
// |
// $Log: not supported by cvs2svn $ |
// Revision 1.2 2005/03/16 18:12:25 jcastillo |
// |
// Style modifications |
// |
// Revision 1.1 2005/01/26 16:51:05 jcastillo |
// New examples for 0.2.5 version |
// |
// Revision 1.2 2004/08/30 14:44:44 jcastillo |
// Code Formater used to give better appearance to SystemC code |
// |
/trunk/examples/sc_ex1.cpp
0,0 → 1,36
#include "sc_ex1.h" // the header for this |
|
#define ROT 0 // NB sc2v 4.2 macros buggy |
#define POPX 1 |
|
|
void icu::decoder_io() // runs once per clock - because .h |
{ |
sc_uint<8> tmp; |
|
tmp = POPX; |
if( reset.read() == 1 ) |
{ |
control_out.write( 0 ); |
} |
else |
{ |
if (alu_ready == 1) |
{ |
switch (instr_in) |
{ |
// this sort of works! case (ROT): |
case ROT : // this does not work |
control_out.write (0x1); // neither does this |
break; |
case 1 : |
control_out.write (0x2); |
break; |
default: |
} |
} |
else // needed? |
{ |
} |
} |
} |
trunk/examples/sc_ex1.cpp
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/examples/sc_ex1.h
===================================================================
--- trunk/examples/sc_ex1.h (nonexistent)
+++ trunk/examples/sc_ex1.h (revision 28)
@@ -0,0 +1,27 @@
+#include "systemc.h"
+
+
+SC_MODULE( icu ) { // module name
+
+ sc_in clk;
+ sc_in reset;
+ sc_in alu_ready;
+ sc_in > instr_in;
+ sc_out alu_start;
+ sc_out< sc_uint<8> > control_out;
+
+ /*
+ sc_signal > pipe_0; // internal "globals"
+ sc_signal > pipe_1;
+ sc_signal > pipe_2;
+ sc_signal > pipe_3;
+ */
+
+ void decoder_io(); // tasks in cpp (fns?)
+
+ SC_CTOR(icu) { // constructors for module
+ SC_METHOD( decoder_io ); // list of methods
+ sensitive_pos( clk ); // event (this pos edge)
+ // if others here forms OR to make event
+ }
+};
trunk/examples/sc_ex1.h
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property