项目整理

****************************************************************
*                         benchmark(cnf)                        *
****************************************************************

    (1)文件名-------------------------------------------c FILE: aim-100-1_6-yes1-1.cnf

    (2) 介绍文字

    (3) 变量个数和子句个数--------------------------------p cnf 100 160

    (4)子句----------------------------------------------11 13 27 0



****************************************************************
*                          C++转换器                            *
****************************************************************

//每个模块之间随机连接
//把1到50的变量随即排序,根据var的规模选择vector?
void get_rand(int a[],int num)
{
     srand((unsigned)time(NULL));//用系统时间初始化,且至多在rand()之间用一次

     for(int i=0;iint a[],int num)
{
     srand((unsigned)time(NULL));
     每一个变量初始值随机
}



        //1.获取每个测试用例的字句数和变量数
        bool get_var_clause_num( string cnf_file_name, int &var_num, int &clause_num)
        {
            ifstream cnf_file(cnf_file_name.c_str());//?    
        }   


        //2.读取每行字句数,处理,转换成verilog,
        bool build_cnf( string cnf_file_name, int var_num, int clause_num )
        {   
            (1)建写文件cnf2------------------------------------ofstream cnf2verilog(result_file_name.c_str());  

            (2)实现随机----------------------------------------get_rand(rand,var_num);
                                                              get_rand1(rand1,var_num);
            (3)写固有模块

            (4)逻辑处理

            //逻辑处理
            for(int i=1;i<=var_num;i++)
            {
                while(!cnf_file.eof()) 
                {
                    处理到子句位置
                }

                while(!cnf_file.eof()) 
                {
                    (1) 存子句中的变量到aa1
                    (2) 判断当前子句是否有 i 或着 -i, 若i和-i都存在,重言式不需要处理
                    (3) 只存在 i, 写 i 的蕴涵推理
                    (4) 只存在 i, 写 -i 的蕴涵推理
                }

                按照存在 i 或者 -i 的子句个数写固有逻辑
           }

        }

cnf2verilog<<"wire Gclear;"<"fsm"<1]<<???
always,begin,???


int main(int argc, char** argv)//argc 两个表示./a.out自身    **.cnf
{

    if((argc<2) | (argc>2))
    {
        std::cout<<"usage:\tcnf2verilog cnf_file"<exit(0);
    }

    int var_name,cause_num;

        if( !get_var_clause_num( argv[1],var_name,cause_num) )
    {
        exit(0);
    }


    if( !build_cnf( argv[1],var_name,cause_num) )
    {
        exit(0);//???
    }
    return 0;
}



#!/bin/bash

sum=10 #初始时置sum为10

#for dir in `find ./  -maxdepth 1 -type d`
#do
#cp a.out $dir

#done




for dir2 in `find ./*.cnf`  #找到所有的cnf文件  for ... in ... 的写法是指将find命令产生的结果分别遍历,dir2中存的是每个结果
do
for ((i=1;i<=10;i++)) #针对每个cnf文件执行10次循环,产生10个文件夹并将运行后产生的文件拷至相应的文件夹中
do
sleep 1s                #休眠1s,也可以不休眠,这里为了让其运行慢一点来debug
./a.out $dir2            #执行./a.out
mkdir $sum             #产生文件夹,文件夹以sum命名,sum初始值为10,每运行一次加1
mv *.v top.v            # 将./a.out 产生的.v文件 重命名为 top.v文件, mv 如果第二个参数不为文件夹,表示重命名为 第二个参数,否则为移动。这里的*.v表示任意以.v结尾的文件,这里只代表一个文件,就是a.out运行后产生的.v 文件
mv *.v ./$sum          # 将top.v文件移动到 sum文件夹中
cp $dir2 ./$sum         # 将dir2也就是原始的cnf文件拷贝至sum文件夹中
sum=$(($sum+1))            #sum 变量加1
echo $sum              #打印sum变量到屏幕

done
done




for dir in `find ./*  -maxdepth 1 -type d` #类似之前的for... in ...循环, 这里的第二个参数也是运行find后的结果,其中的参数maxdepth 1 代表找的文件夹深度为1(也就是文件夹中包含文件夹不会被找到),type d 代表只找文件夹。
do
cp -f ./xdc/*.tcl ./xdc/*.txt ./xdc/*.xdc ./xdc/*.lnk $dir #将xdc下的这些文件拷贝纸dir中,也就是上面find命令找到的目录中,这些文件与硬件相关,是硬件操作需要的配置文件。

done


find *.cnf >0dir.txt  #查找所有的cnf文件,将查找后的结果写入0dir.txt中
cat -n 0dir.txt >00dir.txt #使用cat命令读出0dir.txt文件,并在读出后的结果中每一行前面加入编号(这里的-n 代表加入编号), 并将结果写入00dir.txt文件中。
rm 0dir.txt #将原始的老文件0dir.txt删除
mkdir 0 #产生文件夹0
cp 00dir.txt  0 #将新产生的00dir.txt文件拷贝至文件夹0
cp *.cnf 0  #将所有的cnf文件也拷贝一份到文件夹0,*.cnf代表所有的cnf文件


















你可能感兴趣的:(C++常用编程技巧)