1
0

dokoncene parsovanie a preklad asynchronych modelov.

This commit is contained in:
Dušan Poizl 2011-05-05 14:50:41 +02:00
parent 0c80fb53fe
commit 2712cecaa9
11 changed files with 41 additions and 22 deletions

@ -36,7 +36,7 @@ namespace DEVS
int ModelDefinition::addRule(string &name, string &rule)
{
if(rules.count(name))return -1;
rules[name] = "_event "+name+"(_state current_state, _time current_time, _event *event_vector, _seed *seed){\n"+rule+"}\n";
rules[name] = "_event "+name+"(_state current_state, _time current_time, _event *event_vector, _seed *seed){_event new_event;\n"+rule+"}\n";
transfer_func_declaration += "_event "+name+"(_state current_state, _time current_time, _event *event_vector, _seed *seed);\n";
return 0;
}

@ -96,27 +96,26 @@ namespace DEVS
ss << "_event transfer_func(_state current_state, _time current_time, _event *event_vector, _seed *seed){" << endl;
ss << "size_t x,y;\nx = get_global_id(0);\ny = get_global_id(1);" << endl;
ss << model.zones;
ss << "else " << model.section.local_transition << "(current_state, current_time, event_vector, seed);}" << endl;
ss << "else return " << model.section.local_transition << "(current_state, current_time, event_vector, seed);}" << endl;
ss << endl;
ss << neighbors();
return ss.str();
}
string neighbors()
{
vector<string> n;
n.resize(model.section.neighbors_index.size()+1);
n.resize(model.section.neighbors_index.size());
for(map<string, int>::iterator i = model.section.neighbors_index.begin(); i != model.section.neighbors_index.end();i++)
{
n[i->second] = i->first;
}
stringstream ss;
ss << "__constant int2 neighbors[] = {";
ss << "__constant int neighbors[] = {";
for(unsigned int i=0;i<n.size();i++)
{
ss << "(int2)" << n[i];
if(i<n.size()-1)ss << ", ";
string s;
s = n[i].substr(1, n[i].length()-2);
ss << s << ", ";
}
ss << "};\n";
return ss.str();

@ -860,7 +860,7 @@ namespace DEVS {
/* Line 678 of lalr1.cc */
#line 133 "parser.yy"
{ (yyval.stringVal) = NEWSTR; if(*(yysemantic_stack_[(1) - (1)].stringVal)=="(0,0)")*(yyval.stringVal) = "current_state"; else *(yyval.stringVal) = "event_vector["+driver->toString(driver->model.section.neighbors_index[*(yysemantic_stack_[(1) - (1)].stringVal)])+"].y"; delete (yysemantic_stack_[(1) - (1)].stringVal); }
{ (yyval.stringVal) = NEWSTR; if(*(yysemantic_stack_[(1) - (1)].stringVal)=="(0,0)")*(yyval.stringVal) = "current_state"; else *(yyval.stringVal) = "event_vector["+driver->toString(driver->model.section.neighbors_index[*(yysemantic_stack_[(1) - (1)].stringVal)])+"].state"; delete (yysemantic_stack_[(1) - (1)].stringVal); }
break;
case 48:

@ -130,7 +130,7 @@ REALEXP : IDREF { $$=NEWSTR; *$$ = *$1; delete $1; }
| REALEXP MUL REALEXP { $$=NEWSTR; *$$ = *$1+"*"+*$3; delete $1; delete $3; }
| REALEXP DIV REALEXP { $$=NEWSTR; *$$ = *$1+"/"+*$3; delete $1; delete $3; }
IDREF : CELLREF { $$ = NEWSTR; if(*$1=="(0,0)")*$$ = "current_state"; else *$$ = "event_vector["+driver->toString(driver->model.section.neighbors_index[*$1])+"].y"; delete $1; }
IDREF : CELLREF { $$ = NEWSTR; if(*$1=="(0,0)")*$$ = "current_state"; else *$$ = "event_vector["+driver->toString(driver->model.section.neighbors_index[*$1])+"].state"; delete $1; }
| CONSTANT { $$=NEWSTR; *$$ = driver->toString($1); }
| FUNCTION { $$ = $1; }
| PORTVALUE LBRACKET PORTNAME RBRACKET { $$=NEWSTR; *$$ = "portValue("+*$3+")"; delete $3; }

@ -8,6 +8,9 @@ AsynchronousModel::AsynchronousModel(Machine *parent, string model_definition) :
{
queue_len = 8;
neighbor = 8;
init_kernel = 0;
intermediate_kernel = 0;
compile(model_definition);
loadSource();
}
@ -27,11 +30,15 @@ int AsynchronousModel::getCellSize()
void AsynchronousModel::loadSource()
{
stringstream s;
s << "-I./kernels/ -D NEIGHBOR=" << neighbor << " -D QUEUE_LEN=" << queue_len;
string source = "__constant int neighbors[] = {-1,1, 1,1, -1,-1, 1,-1, 0,1, -1,0, 1,0, 0,-1, 0,0 };\n";
source += "#include \"asynchr.cl\"";
s << getKernelInclude() << " -D NEIGHBOR=" << neighbor << " -D QUEUE_LEN=" << queue_len;
string source = neighbors;//"__constant int neighbors[] = {-1,1, 1,1, -1,-1, 1,-1, 0,1, -1,0, 1,0, 0,-1, 0,0 };\n";
source += "#include \"asynchr.cl\"\n";
source += transfer_functions;
cout << source << endl;
build(source, s.str());
if(init_kernel)clReleaseKernel(init_kernel);
if(intermediate_kernel)clReleaseKernel(intermediate_kernel);
init_kernel = clCreateKernel(program, "init", NULL);
intermediate_kernel = clCreateKernel(program, "intermediateStep", NULL);
}
@ -48,9 +55,12 @@ void AsynchronousModel::renderToTexture(CellSpace *pattern, int which, cl_mem te
int AsynchronousModel::compile(string model_definition)
{
DEVS::CDparser *parser = new DEVS::CDparser(model_definition);
parser->parse();
int ret = parser->parse();
error_message = parser->error.str();
neighbors = parser->neighbors();
transfer_functions = parser->compiledSource();
delete parser;
return 0;
return ret;
}
string AsynchronousModel::getError()

@ -167,6 +167,7 @@ void CellulaMainWindow::createDock()
log = new QDockWidget(trUtf8("Log"), this);
log->setObjectName("log_dock");
QTextEdit *text = new QTextEdit();
text->setReadOnly(true);
LuaConsole *lua = new LuaConsole();
log->setWidget(text);
log->setFeatures(QDockWidget::DockWidgetVerticalTitleBar | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);

@ -10,11 +10,11 @@ __constant uint colors[] = {0,0,0,0, 255,255,255,0, 255,0,0,0, 0,255,0,0, 0,0,25
// sem pojdu prechodove funkcie funkcie
_event transfer_func(_state current_state, _time current_time, _event *event_vector, _seed *seed)
/*_event transfer_func(_state current_state, _time current_time, _event *event_vector, _seed *seed)
{
_event new_event;
if(current_state >= 1.0f && (DEVS_truecount() == 3 || DEVS_truecount() == 2)){ new_event.time = 100; new_event.state = 1; return new_event; }
if(current_state == 0.0f && (DEVS_truecount() == 3)){ new_event.time = 100; new_event.state = 1; return new_event; }
if(true){ new_event.time = 100; new_event.state = 0; return new_event; }
}
*/

@ -46,6 +46,9 @@ takeStep a renderToTexture ktore su potom pouzivane.
*/
cl_int Model::build(string source, string options)
{
if(kernel)clReleaseKernel(kernel);
if(render_kernel)clReleaseKernel(render_kernel);
if(program)clReleaseProgram(program);
cl_int err_code;
//size_t len[] = { source.length() };
program = parent->createProgram(source);

@ -101,6 +101,7 @@ class SynchronousModel : public Model
private:
string nodes;
int num_states, num_neighbors, num_nodes;
string error_message;
};
class AsynchronousModel : public Model
@ -109,6 +110,7 @@ class AsynchronousModel : public Model
int queue_len,neighbor;
cl_kernel init_kernel,intermediate_kernel;
string error_message;
string neighbors, transfer_functions;
public:
AsynchronousModel(Machine* parent, string model_definition);
~AsynchronousModel();

@ -53,6 +53,7 @@ void SynchronousModel::renderToTexture(CellSpace *pattern, int which, cl_mem tex
int SynchronousModel::compile(string model_definition)
{
error_message.clear();
num_neighbors = num_nodes = num_states = 0;
stringstream ss(model_definition);
stringstream serr;
@ -79,7 +80,7 @@ int SynchronousModel::compile(string model_definition)
case TreeScanner::NEIGHBORS: state = 1; break;
case TreeScanner::STATES: state = 2; break;
case TreeScanner::NODES: state = 4; break;
case TreeScanner::END: if(loaded!=7)return -1; break;
case TreeScanner::END: if(loaded!=7){ error_message = "Incomplete model definition"; return -1; } break;
}
token = scanner.lex(&val);
}
@ -90,7 +91,7 @@ int SynchronousModel::compile(string model_definition)
for(int o=0;o<num_states;o++)
{
token = scanner.lex(&val);
if(token!=TreeScanner::NUMBER)return -1;
if(token!=TreeScanner::NUMBER){ error_message = "Incomplete model definition"; return -1; }
n << val << ", ";
}
n << " ";
@ -102,7 +103,7 @@ int SynchronousModel::compile(string model_definition)
string SynchronousModel::getError()
{
return "";
return error_message;
}
int SynchronousModel::loadRLE(istream &fr, size_t *w, size_t *h, CellType **data)

@ -91,15 +91,18 @@ void TextEditor::setName(const QString &name)
int TextEditor::compile(QTextEdit *log)
{
string source = document.toPlainText().toStdString();
model->compile(source);
if(log)
int ret = model->compile(source);
if(log && ret)
{
log->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
QTextCursor t = log->textCursor();
t.insertBlock();
string err = model->getError();
t.insertText(err.c_str());
log->ensureCursorVisible();
}
if(ret)QMessageBox::warning(this, trUtf8("Chyba pri parsovani"), trUtf8("Nepodarilo sa sparsovať definiciu modelu"));
else model->loadSource();
return 0;
}