Home > SytemC Tutorials > SystemC Tutorial: threads, methods and sc_spawn

SystemC Tutorial: threads, methods and sc_spawn

Forewords

This tutorial is intended to be a basic introduction to the notions of concurrent processes in SystemC. We will touch on the SystemC ability to dynamically spawn processes.

Processes in SystemC

One of the essential element of the SystemC language is concurrency. This is achieved through what we will call processes. Processes are similar to processes in VHDL or always/initial in Verilog. In principle processes are block of sequential code similar to functions. However, unlike functions, processes are not explicitly called by the user. Processes can in effect be seen as always active; For that reason they are considered to be concurrent.
In the SystemC language there are two distinct kinds of processes namely: SC_METHOD and SC_THREAD. These two kind of processes are typically created statically; In other words they are created prior to the execution of the simulation. Alternatively SystemC allows processes to be created dynamically via a dedicated function called: sc_spawn() .

The SC_THREAD process

As a first step we will look at the SystemC SC_THREAD. A thread by definition is a process that will automatically execute itself at the very start of a simulation run and then will suspend itself for the rest of the simulation.
Threads are versatile processes in the sense that they can be halted at any moment and any number of times during their execution. Interestingly, although the thread is mean to be executed only once throughout the simulation, most of times we want to be able to use threads for the whole duration of the simulation. In order to achieve this, we use a simple ‘trick’ that consist in creating an infinite loop within a thread. Consequently we prevent the thread from ever reaching its sequential end. The following example illustrates how to create a simple thread used to generate a clock generator.

void run() {
   while(true) {
      clock_signal.write(SC_LOGIC_0);
      wait(10, SC_NS);
      clock_signal.write(SC_LOGIC_1);
      wait(10, SC_NS);
   }
}

Three main observations can be made:

  • The funtion ‘run’ does not have any input or return parameters. This typical of a SystemC static process such as SC_THREAD or SC_METHOD.
  • An infinite while loop is used to prevent the function ‘run’ from ever reaching its end. This does not have to be used for all SC_THREAD implementations; however it is a common occurrence.
  • We are using ‘wait’ function calls to force a temporary suspension of the function ‘run’ and the update of the ‘clock_signal’ value. This can only be used by SC_THREAD processes.

Up until now we have only created a C++ member function that will be used as a thread. At this time we will need to indicate to the SystemC simulation kernel that this specific member function (in our case ‘run’) should be treated as a concurrent thread and not as a basic C++ member function. This will be done through an operation called processes registration. To put it simply this consists in enumerating how individual functions should be treated. This simple operation is done inside the constructor of a module. The following code will illustrate how this is achieved.

sample_module(sc_module_name nm):sc_module(nm) {
   SC_THREAD(run);
}

In this example we assume the existence of a SystemC called ‘sample_module’. The process registration of the member function ‘run’ as an SC_THREAD is done by passing the name of the selected function (run) as an argument of the macro SC_THREAD.

The SC_METHOD process

The SC_METHOD is in many ways similar to the SC_THREAD. However there are two main differences: SC_METHOD will run more than once by design and methods cannot be suspended by a wait statement during their execution. The following code illustrates this.

void log() {
   count_signal.write(count_signal.read()+1);
   if (count_signal.read() >= 10) {
      cout << "Reached max count" << endl;
      count_signal.write(0);
   }
}

From this sample we can observe that no wait statements are being used. Additionally there is no need for an infinite ‘while’ loop since this is the nature of an SC_METHOD to go back to it’s beginning when it finishes executing.
However not visible inside the code lies a hidden wait statement. That implicit statement is always located on the very last line of the member function and causes the kernel to suspend the SC_METHOD so that its sensitivity list can be evaluated.

Processes Sensitivity

SystemC support two kind of sensitivity: Dynamic and static. For the purpose of this tutorial we will concern ourselves only with that later. Both SC_THREAD and SC_METHOD may have a sensitivity list although they are not obliged to. In the example of the SC_THREAD covered previously we did not use a static sensitivity list; For the SC_METHOD example we will have to.
As seen before the SystemC requires a kernel registration to identify which member function it needs to treat as a SC_METHOD (no explicit suspension allowed) or an SC_THREAD (suspensions allowed). In the case of the method processes we will use the macro SC_METHOD. The following code illustrates the registration of the ‘log’ function as a SC_METHOD.

sample_module(sc_module_name nm):sc_module(nm) {
   SC_METHOD(log);
      sensitive << clock_signal.posedge_event();
}

As can be observed we now have an additional statement indicating that the macro directly above it is sensitive to positive edges of the signal ‘clock_signal’. That sensitivity list will typically contain event objects as well as ports or channels (signals).
Consequently as soon as a positive edge is detected on the signal ‘clock_signal’, the function ‘log’ will be re-executed.

The last point of detail remaining is to indicate to the kernel that this module that we have created will contain concurrent processes. This is done using the macro SC_HAS_PROCESS(moduleName).

The full code for this section on threads, methods and sensitivity list is shown here:

class sample_module: public sc_module
{
	public:
	sc_signal clock_signal;
	sc_signal count_signal;
	SC_HAS_PROCESS(sample_module);
	sample_module(sc_module_name nm):sc_module(nm) {
		SC_THREAD(run);
		SC_METHOD(log);
			sensitive << clock_signal.posedge_event();
	}
	void log() {
		count_signal.write(count_signal.read()+1);
		if (count_signal.read() >= 10) {
			cout << "Reached max count" << endl;
			count_signal.write(0);
		}
	}

	void run() {
		while(true) {
			clock_signal.write(SC_LOGIC_0);
			wait(10, SC_NS);
			clock_signal.write(SC_LOGIC_1);
			wait(10, SC_NS);
		}
	}
};

Dynamic processes

In the first part of this tutorial we have looked at the most common usage of processes in SystemC. Nevertheless there is yet a more sophisticated way of creating processes by spawning functions at will. This method is by far the most flexible and most complete.
The sc_spawn function can be seen as a super-set of the existing SC_THREAD, SC_METHOD macros. It can be used as a straight replacement although the semantics is a bit more involving.
A very basic example of the function sc_spawn is as follows. Assuming that we have an existing member function as such:

void spawned_th(bool value) {
   cout << "spawned_th successfuly spawned with value: "
          << value << endl;
}

A call to spawn that function from within an SC_THREAD would be as such:

sc_spawn( sc_bind(&sample_module::spawned_th, this, true) );

Without going in too much details, this call relies on an additional function sc_bind that is required to attach an existing function. This is done by passing the address (&) of the required member function as an argument. In addition, we need to indicate that this specific function is not a global function (this is also allowed) but a member function of our module hence the use of ‘this’. Finally the function ‘spawned_th’ has one input paramenter ‘value’ of type bool therefore we set an actual value (true) inside the ‘sc_bind’ call.

A more complete example is as follows:

class sample_module: public sc_module
{
   public:
   sc_signal clock_signal;
   SC_HAS_PROCESS(sample_module);
   sample_module(sc_module_name nm):sc_module(nm) {
      SC_THREAD(run);
   }

   void spawned_th(bool value) {
      cout << "spawned_th successfuly spawned with value: "
             << value << endl;
   }

   void run() {
      sc_spawn( sc_bind(&sample_module::spawned_th, this, true) );

      while(true) {
         clock_signal.write(SC_LOGIC_0);
         wait(10, SC_NS);
         clock_signal.write(SC_LOGIC_1);
         wait(10, SC_NS);
      }
   }
};

As stated earlier this example has been kept very simple for the purpose of clarity. Additional features would be the ability to:

  • Specify a return argument for the spawned function
  • Specify if the argument passed to the function are reference (as opposed to copies) or constant references
  • Spawn a global function instead of a member function
  • Being able to specify if the spawned function should be treated as a method or thread(default)
  • Being able synchronise thread activities by checking their status (idle or running)

Most of those options can fairly easily be achieved however they fall outside of the scope of this tutorial. Nevertheless to give you a more complete picture of the ‘sc_spawn’ function, we will illustrate the spawning of a global function with return arguments and reference input arguments.

#define SC_INCLUDE_DYNAMIC_PROCESSES

int global_th(const bool& in_value, int& out_value) {
   cout << "global_th successfuly spawned with value: "
          << in_value << ", " << out_value << endl;

   if (in_value) {
      out_value++;
      wait(2, SC_NS);
      return 0;
   }
   wait(5, SC_NS);
   return 1;
}

class sample_module: public sc_module
{
   public:
   sc_signal clock_signal;
   SC_HAS_PROCESS(sample_module);
   sample_module(sc_module_name nm):sc_module(nm) {
      SC_THREAD(run);
   }

   void run() {
      int actual_return_value, actual_int_arg = 9;
      bool actual_bool_arg = true;

      sc_spawn( &actual_return_value, sc_bind(&global_th,
                       sc_cref(actual_bool_arg),
                       sc_ref(actual_int_arg) ) );

      while(true) {
         clock_signal.write(SC_LOGIC_0);
         wait(10, SC_NS);
         clock_signal.write(SC_LOGIC_1);
         wait(10, SC_NS);
      }
   }
};

This time the ‘sc_spawn’ function has an additional argument for the returned value (passed by pointer) in addition the ‘this’ argument was removed since we are now dealing with a global function. The ‘sc_cref’ and ‘sc_ref’ functions were used to indicate that we were dealing with constant reference and reference formal arguments.

Conclusions

This tutorial covered the basic uses of SystemC processes. we announced the rules regarding the suspension of processes and looked at the sensitivity list and kernel registrations. Lastly we covered the use of the sc_spawn function and saw how can generic functions can be parallelised at will.

Et voila!

David Cabanis.

About these ads
Categories: SytemC Tutorials
  1. Gopal S
    February 21, 2008 at 8:18 pm

    Great article. Can you also touch upon
    SC_CTHREAD and use/not use of dont_initialize()?
    Thanks

  2. February 26, 2008 at 11:17 pm

    Hi there,

    Good point about the SC_CTHREADs. I did leave them out because they were deamed as deprecated since you could achieve much of the same with say an SC_THREAD and a sensitivity list that had something like clk.pos() inside it.
    Nevertheless there is a lot of activity recently on SystemC synthesis and in this specific context SC_CTHREAD are the way ahead to model clocked logic. More so since the SC_THREAD are not supported in SystemC synthesis.

    Thanks for your remark, I should put a little tutorial on the subject of SystemC synthesis and restore the SC_CTHREAD to its rightfull place.

    As far as dont_initialize() is conserned, it’s purpose is to avoid processes to be executed at initialisation time ( straight after elaboration and just before simulation). Its often found when you may encouter undeterministic behaviour depending on the order of execution of your processes. In other work if one process starting first may block another process.
    I hope that helps, I think I would need an example to better illustrate that.

    Regards,

    David Cabanis

    • eagal
      August 16, 2013 at 6:30 am

      Hi,

      I am new to Systemc.
      which functionality of SC_CTHREAD we cant achieve by SC_THREAD i mean whats diffrence between SC_THREAD and SC_CTHREAD. And why SC_THREAD not supported in systemc synthesis.

  3. September 22, 2008 at 6:34 pm

    thats for sure, man

  4. May 23, 2010 at 10:03 pm

    hello, I am new here can someone tell me how can download movies from youtube?

  5. January 5, 2012 at 1:03 pm

    Хочу вам рассказать о сертификат соответствия труба асбестоцементная . Мы ькажем квалифицированную помщоь, вы останетесь довольны.

  6. DaJsdGopaer
    January 6, 2012 at 4:21 pm

    Компьютер перестал включаться… Везти по жаре никуда не охота, вот в центре компьютерной помощи вроде специалисты на дом выезжают и осуществляют ремонт компьютеров, на дому, они дорого берут?

  7. QueewmouMefew
    January 26, 2012 at 3:42 am

    Соберем для вас базы мобильных номеров для рассылки смс, звонков, спама… нам пофиг, как вы будете их использовать.

    Тематики для выборки:

    Купля/продажа
    Знакомства
    Недвижимость
    Транспорт (Авто)
    Услуги
    Общество
    Бизнес
    Работа

    Спарсим любой регион России, а так же Украина, Беларусь и еще пара стран.

    Стоимость 1000 номеров = 1$

    При больших заказах скидки.

    1.Базы постоянно обновляются.
    2.Конфиденциальность

    подробнее на http://xpymep.16mb.com или в аське 9079009

  8. LobsterBubster
    January 27, 2012 at 3:48 am

    Получить монеты и алмазы, быстро и много в приложении Загадочный Дом
    http://secret-house.tk – заходим и качаемся!

  9. April 4, 2013 at 12:23 am

    Привет всем предлагаю Скачать Xrumer full7.0.10 IMMORTALIS Скачать это первая и самая стабильная версия в сети.

  10. April 12, 2013 at 9:08 pm

    Hey There. I found your blog using msn. That is a really neatly written article.

    I will make sure to bookmark it and come back to read extra of
    your useful information. Thanks for the post. I’ll certainly comeback.

  11. galaxy duos accessories
    April 13, 2013 at 10:27 pm

    It is in reality a great and helpful piece
    of info. I am glad that you just shared this helpful information with
    us. Please stay us up to date like this. Thanks for sharing.

  12. April 16, 2013 at 2:13 am

    Its like you learn my thoughts! You seem to understand
    so much about this, such as you wrote the e book in it or something.

    I feel that you just could do with a few % to pressure the message house a bit, however other than that, that is fantastic blog. A fantastic read. I’ll definitely be back.

  13. April 18, 2013 at 12:46 am

    Hello mates, how is everything, and what you want
    to say regarding this article, in my view its really amazing for me.

  14. April 18, 2013 at 3:01 am

    Hey there would you mind stating which blog platform you’re using? I’m looking to start my own blog soon but I’m having a difficult time deciding between BlogEngine/Wordpress/B2evolution and Drupal. The reason I ask is because your design seems different then most blogs and I’m looking for
    something completely unique. P.S Apologies for getting off-topic but I had
    to ask!

  15. April 23, 2013 at 11:10 am

    Wow that was unusual. I just wrote an extremely long comment but after I clicked submit my comment
    didn’t appear. Grrrr… well I’m not writing all that over again.
    Regardless, just wanted to say wonderful blog!

  16. April 27, 2013 at 5:06 am

    We are a group of volunteers and starting a new scheme in our community.
    Your site offered us with valuable info to work on. You have done a formidable job and our entire community will be grateful to you.

  17. April 27, 2013 at 4:51 pm

    Hello, after reading this remarkable post i
    am also cheerful to share my experience here with friends.

  18. April 27, 2013 at 6:43 pm

    May I simply say what a comfort to discover a person that genuinely knows what they are discussing over the internet.
    You actually understand how to bring a problem to
    light and make it important. More people ought to check this out and understand this side of the story.
    I can’t believe you are not more popular since you surely possess the gift.

  19. April 28, 2013 at 2:01 pm

    Very rapidly this web site will be famous amid all blogging visitors,
    due to it’s nice posts

  20. April 30, 2013 at 4:15 am

    If some one wants expert view concerning blogging and site-building after that i suggest him/her to
    pay a visit this blog, Keep up the good work.

  21. April 30, 2013 at 4:20 pm

    Good replies in return of this query with genuine arguments and telling the
    whole thing regarding that.

  22. May 7, 2013 at 8:49 am

    Плануйте літній відпочинок для всієї сім’ї на узбережжі Болгарії. Екологічно чистий край, різноманіття готелів, система харчування все включено та прямі чартерні вильоти зі Львова. Миттєве он-лайн бронювання турів до Болгарії від надійного туроператора Тур-Галичина. Бажаємо Вам гарного літнього відпочинку, незабутніх вражень.

  23. SEM
    May 21, 2013 at 5:14 am

    Hi there! I simply wish to give an enormous thumbs up for the
    nice information you’ve got right here on this post.
    I will be coming again to your blog for more soon.

  24. SCnewcom
    May 21, 2013 at 4:39 pm

    Thanks for really nice explaination. I have onequestion: When I am spawning a process , my simulator renames latter decalration and increments it everytime it is called and spawned object never gets removed, Is there any way to get rid of spawned object each time? Is this a problem for memory (consuming more memory)?

  25. June 5, 2013 at 12:50 am

    Whats up! I just wish to give an enormous thumbs up for the good data you have right here
    on this post. I might be coming again to your blog for more
    soon.

  26. July 26, 2013 at 10:20 pm

    Здравствуйте уважаемые участники sclive.wordpress.com
    Предлагаем Вашему вниманию услуги энергосберегающие лампы
    Наши клиенты к нам обращаются снова и снова, так как довольны уровнем качества сервиса. Мы имеем отличные отзывы и рекомендации.

    Пс: Модераторы, если разместил не там, то перенесите пожалуйста.

  27. August 12, 2013 at 5:24 am

    I was searching for process tutorials on C++ and found your post. Until now I wasn’t aware of SystemC. I will look in to it more details. Thanks for providing this information.

  28. August 21, 2013 at 3:11 pm

    It’s very straightforward to find out any matter on web as compared to textbooks, as I found this paragraph at this website.

  29. November 20, 2013 at 6:02 pm

    Предлагаю диодные лампы с обычным цоколем для
    выращивания и подсвечивания растений.
    Доступная цена (сравните сами!) Гарантия.
    Мощность одной лампочки – 3 Вт.
    Состоит из красных и синих диодов, которые
    излучают свет, полезный для корней и листвы.
    Незаменима в осенне-зимний период.
    http://www.avito.ru/sankt-peterburg/rasteniya/lampa_diodnaya_dlya_rastenij_118185500

    skype: s9401101, на email и в личку не отвечаю.
    тел. +79013028112 Михаил.

  30. November 28, 2013 at 4:33 am

    Shemale photos

    http://animeshemale.net.erolove.in/?page.mckenzie

    shamale sex free movies free seamale sex chicks with dicks free pornagrafic vidios

  31. December 14, 2013 at 4:56 am

    Космос устроен очень интересно, а челеовек устройством подобен космосу. Веды содержат информацию исчерпывающую обо всем.

  32. December 15, 2013 at 3:25 pm

    Решил, к примеру, что я хочу, чтобы у меня появилась квартира! Ради этого я бросаю курить! Навсегда!

  33. December 20, 2013 at 3:45 pm

    名刺入れ gucci|gucci_goi.crosscs.com|名刺入れ gucci
    prada リボン パンプス http://skimpmgfz.ohiostage.com

  34. December 22, 2013 at 6:01 am

    По данным Всемирной организации здравоохранения, привычка употреблять спиртное является причиной почти 4 % всех смертей в мире. От злоупотребления спиртными напитками погибает больше населения, чем от СПИДа, туберкулеза и войн. Наибольшее влияние употребления алкоголя на летальность наблюдается в РФ и странах СНГ: каждый пятый человек в них умирает от причин, связанных с употреблением спиртного

  35. March 4, 2014 at 5:30 am

    Посмотрите на досуге – http://ardiss.ru/o-nas/novosti/maloetazhnaya-zastrojka-budushhee-rossii возможно вы захотите себе его купить. А также: дачный дом из металлоконструкций цена, проекты деревянных брусовых домов, купить готовый дом под ключ цена.

  36. CarmenMept
    March 27, 2014 at 1:05 pm

    Интернет-магазин xn—-8sbfwllfk1a8d9a.rezinanet.ru предлагает широкий выбор шин и дисков на любой автомобиль. Удобная система подбора по марке автомобиля безошибочно покажет вам характеристики и все возможные варианты, которые подходят на ваш автомобиль. Наш интернет магазин действует на территории всей страны и это значит, что жители всех регионов России без труда получат свой товар в удобное для них время в ближайшем отделении транспортных компаний

  37. April 11, 2014 at 12:22 am

    ОТК 2 оказывает услуги по перевозке грузов и сборных конструкций на низкорамном трале.
    В основе: низкая площадка, к которой по задним аппарелям заходит строительная техника.
    Немаловажен тяговитый тягач. Максимальный вес трала составляет 40т.

    Наши преимущества: аренда трала тут
    Обеспечим безопасный маршрут для негабаритного груза.

    Прайс-Лист:
    доставка легкого груза – 10000р
    перевозка тяжеловесного груза – 15000р.

    Аренда трала в Санкт-Петербурге и Лен. области: 8 (911) 2997675

  38. ValentinMept
    April 11, 2014 at 8:50 am

    Интернет-магазин xn—-8sbfwllfk1a8d9a.rezinanet.ru предлагает широкий выбор шин и дисков на любой автомобиль. Удобная система подбора по марке автомобиля безошибочно покажет вам характеристики и все возможные варианты, которые подходят на ваш автомобиль. Наш интернет магазин действует на территории всей страны и это значит, что жители всех регионов России без труда получат свой товар в удобное для них время в ближайшем отделении транспортных компаний

  39. alpaigorrig
    July 10, 2014 at 6:08 am

    Раскручу ваше сообщество Вконтакте.
    Только НАСТОЯЩИЕ подписчики (без собачек и ботов).
    Если пожелаете – до 100 000 подписчиков и больше (опыт имеется).
    Профессиональные (обладающие собственным неповторимым стилем)
    тексты с изображениями на заказ. Оплата договорная –
    по результату. То есть вы ничем не рискуете.
    Предложение уникально: так как из-за событий на Украине
    вынужден искать работу на стороне.
    Мои контакты:
    Skype – altaypa1
    Email – altaypa@mail.ru

  40. September 6, 2014 at 12:32 am

    Строительство брусовых домов под ключ недорого, все прочнее занимают свое место на строительном рынке, составляя все более достойную конкуренцию другим традиционным материалам, как то оцилиндрованное бревно или глиняный кирпич.
    Строим быстро, качественно и недорого!!!
    Только русские специалисты!

  41. Сергей Митриченко
    November 9, 2014 at 10:02 pm

    Уважаемый администратор сайта sclive.wordpress.com
    Меня зовут Сергей Митриченко.
    Я занимаюсь поисковой оптимизацией и продвижением сайтов в сети интернет.
    Моим клиентам требуются качественные ссылки для продвижения их сайтов в поисковых системах. Поэтому я позволил себе обратиться к Вам. Меня интересует покупка ссылок со страниц Вашего сайта. Чтобы избежать возможных подозрений, предлагаю воспользоваться биржей ссылок “Sape.ru”.
    Подробности о ее работе можно узнать по ссылке http://optimok.ru/sape.html
    После добавления Вашего сайта, он станет доступен для поиска и я смогу купить нужные мне ссылки.
    С уважением, Сергей Митриченко.

  42. alokigorrig
    November 11, 2014 at 11:53 am

    Качественная раскрутка вашей группы Вконтакте
    с настоящими, живыми подписчиками (без собачек,
    ботов, фейковых аккаунтов и без риска списания).
    Оплата по результату (то есть вы ничем не рискуете).
    Могу создать и раскрутить ваше сообщество с нуля.
    Профессиональные (обладающие собственным неповторимым стилем)
    тексты с изображениями. Если пожелаете – до 100 000
    подписчиков и больше (опыт имеется).
    Мои контакты:
    Skype – altaypa1
    Email – altaypa@mail.ru

  43. December 9, 2014 at 4:48 pm

    Здравствуйте!
    Я представляю интересы компании «МАКО-Логистик» – логистического оператора в сфере внешнеэкономической деятельности.
    Наша компания предлагает Вам комплексные решения по логистике, экспедированию и таможенному оформлению грузов из Китая.

    Перечень предлагаемых услуг:
    • Таможенное оформление грузов в Китае и России
    • Транспортировка и экспедирование грузов из Китая
    • Полное сопровождение контрактов
    • Поиск товаров и производителей в Китае
    • Контроль выполнения заказов
    • Отслеживание грузов в пути

    У нас индивидуальный подход к каждому клиенту.
    1. Для клиентов, желающих найти новое направление для своего бизнеса на выгодных условиях – осуществляем поиск производителя и товара – проверяем надёжность производителя – пересылаем образцы продукции.
    2. Для клиентов, которые ценят своё время – расчёт поставки и себестоимости товара – контроль производства, отгрузки – таможенное оформление в КНР и в России – доставка до получателя.
    3. Для клиентов, планирующих таможенное оформление собственными силами – проведение переговоров – подписание международного контракта – контроль производства и отгрузки – таможенное оформление товара в КНР.
    4. Для клиентов, планирующих знакомство с поставщиком продукции – разработка маршрута по Китаю – бронирование/покупка авиа и жд билетов – подбор и бронирование номеров в гостиницах – предоставление услуг переводчика – организация и сопровождение переговоров с заводами.
    5. Для клиентов, нуждающихся в юридической помощи – изучение и подготовка документации для обращения в суд – представление интересов в суде – информирование о ходе судебного процесса.

    Команда профессионалов МАКО Logistic подберет для Вас оптимальные пути транспортировки товара (автомобильные, морские, железнодорожные перевозки), и оптимизирует расходы на поставку.

    МАКО Logistic – мы знаем принципы работы с Китаем!

    С уважением, Ваш персональный консультант
    Специалист отдела международных поставок
    Манукова Олеся
    MAKOLOGISTIC
    Контакты в России:
    Тел/факс:+7(4162)35-24-60
    ICQ:604027253
    Skype: olesya_makologistiс

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: